Sat Mar 7 2020

This commit is contained in:
GenZmeY 2020-07-09 01:56:38 +03:00
parent cf7cbbfc85
commit 03b40427af
7 changed files with 165 additions and 48 deletions

View File

@ -18,24 +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.6.0" ScriptVersion="0.7.0"
AppServerNum="232130" AppServerNum="232130"
AppClientNum="232090" 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"
DownloadMapsDir="$InstallDir/Binaries/Win64/steamapps/workshop/content/$AppClientNum"
CacheMapsDir="$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')
@ -52,7 +42,8 @@ function show_help ()
echo "$ScriptName v$ScriptVersion" 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 создает новый ЭКЗЕМПЛЯР сервера"
@ -113,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
@ -126,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"
} }
@ -159,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
@ -168,8 +163,21 @@ function server_exists ()
function updates_aviable () function updates_aviable ()
{ {
# TODO: implementation # TODO: check
return 0 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
else
return 1
fi
} }
function new_instance () # $*: InstanceName[s] function new_instance () # $*: InstanceName[s]
@ -230,7 +238,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
} }
@ -330,12 +338,11 @@ 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 $AppServerNum $BetaArg validate +exit steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg validate +exit
echo "$BranchName" > "$ActiveBranch"
start_instance start_instance
} }
@ -392,13 +399,43 @@ 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 DownloadMapsDirOrig="$InstallDirOrig/Binaries/Win64/steamapps/workshop/content/$AppClientNum"
local CacheMapsDirOrig="$InstallDirOrig/KFGame/Cache"
local DownloadMapsDirBeta="$InstallDirBeta/Binaries/Win64/steamapps/workshop/content/$AppClientNum"
local CacheMapsDirBeta="$InstallDirBeta/KFGame/Cache"
if [[ -z "$BetaPostfix" ]]; then # Orig
sudo -u "$SteamUser" install -d -m 775 "$DownloadMapsDirOrig"
if [[ -d "$CacheMapsDirBeta" ]]; then
ln -s "$CacheMapsDirBeta" "$CacheMapsDirOrig"
rm -rf "$DownloadMapsDirOrig"
ln -s "$DownloadMapsDirBeta" "$DownloadMapsDirOrig"
else
sudo -u "$SteamUser" install -d -m 775 "$CacheMapsDirOrig"
fi
else # Beta
sudo -u "$SteamUser" install -d -m 775 "$DownloadMapsDirBeta"
if [[ -d "$CacheMapsDirOrig" ]]; then
ln -s "$CacheMapsDirOrig" "$CacheMapsDirBeta"
rm -rf "$DownloadMapsDirBeta"
ln -s "$DownloadMapsDirOrig" "$DownloadMapsDirBeta"
else
sudo -u "$SteamUser" install -d -m 775 "$CacheMapsDirBeta"
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 $AppServerNum $BetaArg validate +exit; then
echo "Errors during installation - exit" echo "Errors during installation - exit"
exit 1 exit 1
@ -419,22 +456,18 @@ function update_kf2 ()
break break
fi fi
sleep 2 sleep 2
# TODO: KFWeb.ini > webadmin=true
done done
killall -KILL KFGameSteamServer.bin.x86_64 killall -KILL KFGameSteamServer.bin.x86_64
set_ini_permissions "$DefaultConfigDir" create_map_dirs
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$CacheMapsDir"
fix_steamclient_so fix_steamclient_so
ln -s "$InstanceConfigDir" "$InstanceConfigLnk" ln -s "$InstanceConfigDir" "$InstanceConfigLnk"
make_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 $AppServerNum $BetaArg +exit
steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg +exit start_instance
start_instance
else
validate
fi
fi fi
} }
@ -687,7 +720,7 @@ function map_sync ()
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 "$CacheMapsDir" -type f -name '*.kfm' -printf "%f\n") for MapFile in $(find -L "$CacheMapsDir" -type f -name '*.kfm' -printf "%f\n")
do do
MapName=$(echo "$MapFile" | sed -r 's|.kfm$||g') MapName=$(echo "$MapFile" | sed -r 's|.kfm$||g')
if [[ ! -f "$Config" ]]; then if [[ ! -f "$Config" ]]; then
@ -883,6 +916,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"
DownloadMapsDir="$InstallDir/Binaries/Win64/steamapps/workshop/content/$AppClientNum"
CacheMapsDir="$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; ;;

3
SOURCES/kf2-srv-beta Normal file
View File

@ -0,0 +1,3 @@
#!/bin/bash
/usr/bin/kf2-srv beta $*

View File

@ -0,0 +1,14 @@
[Unit]
Description=Check and Update Killing Floor 2 server
[Service]
Type=simple
ExecStart=/usr/bin/kf2-srv-beta --update
PrivateTmp=true
PrivateDevices=true
ProtectHome=false
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,9 @@
[Unit]
Description=Check and Update killing Floor 2 beta job
[Timer]
OnCalendar=*-*-* 4:00:00
Unit=kf2-srv-beta-update.service
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,21 @@
[Unit]
Description=Killing Floor 2 Beta Server Daemon - %i
[Service]
User=steam
Group=steam
Type=simple
StandardOutput=null
StandardError=null
EnvironmentFile=/etc/kf2-srv/instances-beta/%i/main.conf
ExecStart=/usr/games/kf2-srv-beta/Binaries/Win64/KFGameSteamServer.bin.x86_64 $Args configsubdir=instances/%i $PortW $PortQ $PortG
Restart=always
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -2,7 +2,7 @@
Description=Check and Update killing Floor 2 job Description=Check and Update killing Floor 2 job
[Timer] [Timer]
OnCalendar=Wed, 04:00 OnCalendar=*-*-* 4:00:00
Unit=kf2-srv-update.service Unit=kf2-srv-update.service
[Install] [Install]

View File

@ -1,7 +1,7 @@
%global steamuser steam %global steamuser steam
Name: kf2-srv Name: kf2-srv
Version: 0.6.0 Version: 0.7.0
Release: 1%{dist} Release: 1%{dist}
Summary: Killing Floor 2 server Summary: Killing Floor 2 server
Group: Amusements/Games Group: Amusements/Games
@ -9,17 +9,28 @@ License: GNU GPLv3
BuildArch: noarch BuildArch: noarch
Source1: %{name} Source1: %{name}
Source2: %{name}.conf Source2: %{name}-beta
Source3: %{name}.xml Source3: %{name}.xml
Source4: %{name}@.service Source4: %{name}@.service
Source5: %{name}-update.service Source5: %{name}-update.service
Source6: %{name}-update.timer Source6: %{name}-update.timer
Source7: main.conf.template Source7: main.conf.template
Source8: %{name}-beta@.service
Source9: %{name}-beta-update.service
Source10: %{name}-beta-update.timer
Requires: systemd >= 219 Requires: systemd >= 219
Requires: steamcmd Requires: steamcmd
Requires: libxml2 Requires: libxml2
Requires: dos2unix Requires: dos2unix
Requires: curl
Requires: grep
Requires: coreutils
Requires: sed
Requires: util-linux
Requires: sudo
Requires: psmisc
Requires: gawk
Provides: %{name} Provides: %{name}
@ -37,29 +48,34 @@ install -m 755 -d %{buildroot}/%{_bindir}
install -m 755 -d %{buildroot}/%{_prefix}/lib/systemd/system install -m 755 -d %{buildroot}/%{_prefix}/lib/systemd/system
install -m 755 -d %{buildroot}/%{_prefix}/lib/firewalld/services install -m 755 -d %{buildroot}/%{_prefix}/lib/firewalld/services
install -m 755 -d %{buildroot}/%{_sysconfdir}/%{name}/instances install -m 755 -d %{buildroot}/%{_sysconfdir}/%{name}/instances
install -m 755 -d %{buildroot}/%{_sysconfdir}/%{name}/instances-beta
install -m 644 -d %{buildroot}/%{_prefix}/games/%{name} install -m 644 -d %{buildroot}/%{_prefix}/games/%{name}
install -m 644 -d %{buildroot}/%{_prefix}/games/%{name}-beta
install -m 755 %{SOURCE1} %{buildroot}/%{_bindir} install -m 755 %{SOURCE1} %{buildroot}/%{_bindir}
install -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/%{name} install -m 644 %{SOURCE2} %{buildroot}/%{_bindir}
install -m 644 %{SOURCE3} %{buildroot}/%{_prefix}/lib/firewalld/services install -m 644 %{SOURCE3} %{buildroot}/%{_prefix}/lib/firewalld/services
install -m 644 %{SOURCE4} %{buildroot}/%{_prefix}/lib/systemd/system install -m 644 %{SOURCE4} %{buildroot}/%{_prefix}/lib/systemd/system
install -m 644 %{SOURCE5} %{buildroot}/%{_prefix}/lib/systemd/system install -m 644 %{SOURCE5} %{buildroot}/%{_prefix}/lib/systemd/system
install -m 644 %{SOURCE6} %{buildroot}/%{_prefix}/lib/systemd/system install -m 644 %{SOURCE6} %{buildroot}/%{_prefix}/lib/systemd/system
install -m 644 %{SOURCE7} %{buildroot}/%{_sysconfdir}/%{name} install -m 644 %{SOURCE7} %{buildroot}/%{_sysconfdir}/%{name}
install -m 644 %{SOURCE8} %{buildroot}/%{_prefix}/lib/systemd/system
sed -i -r "s|^(InstallDir=).*$|\1\"%{_prefix}/games/%{name}\"|g" %{buildroot}/%{_bindir}/%{name} install -m 644 %{SOURCE9} %{buildroot}/%{_prefix}/lib/systemd/system
install -m 644 %{SOURCE10} %{buildroot}/%{_prefix}/lib/systemd/system
%clean %clean
rm -rf $RPM_BUILD_ROOT rm -rf $RPM_BUILD_ROOT
%files %files
%attr(775,root,%{steamuser}) %dir %{_prefix}/games/%{name} %attr(775,root,%{steamuser}) %dir %{_prefix}/games/%{name}
%attr(775,root,%{steamuser}) %dir %{_prefix}/games/%{name}-beta
%attr(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name} %attr(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}
%attr(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/instances %attr(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/instances
%attr(644,root,root) %{_sysconfdir}/%{name}/main.conf.template %attr(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/instances-beta
%attr(644,root,root) %config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf %attr(644,root,root) %config(noreplace) %{_sysconfdir}/%{name}/main.conf.template
%attr(644,root,root) %config(noreplace) %{_prefix}/lib/firewalld/services/%{name}.xml %attr(644,root,root) %config(noreplace) %{_prefix}/lib/firewalld/services/%{name}.xml
%attr(755,root,root) %{_bindir}/%{name} %attr(755,root,root) %{_bindir}/%{name}
%attr(755,root,root) %{_bindir}/%{name}-beta
%attr(644,root,root) %{_prefix}/lib/systemd/system/* %attr(644,root,root) %{_prefix}/lib/systemd/system/*
%preun %preun
@ -67,9 +83,17 @@ if [[ $1 -eq 0 ]] ; then # Uninstall
%{_bindir}/%{name} --stop %{_bindir}/%{name} --stop
%{_bindir}/%{name} --disable %{_bindir}/%{name} --disable
rm -rf %{_prefix}/games/%{name}/* rm -rf %{_prefix}/games/%{name}/*
rm -rf %{_prefix}/games/%{name}-beta/*
rm -rf %{_sysconfdir}/%{name}/instances/default
rm -rf %{_sysconfdir}/%{name}/instances-beta/default
fi fi
%changelog %changelog
* Sat Mar 7 2020 GenZmeY <genzmey@gmail.com> - 0.7.0-1
- dual versions support;
- check updates;
- bugfixes.
* Sat Jan 18 2020 GenZmeY <genzmey@gmail.com> - 0.6.0-1 * Sat Jan 18 2020 GenZmeY <genzmey@gmail.com> - 0.6.0-1
- versions; - versions;
- instance conf tweaks; - instance conf tweaks;