diff --git a/SOURCES/kf2-srv b/SOURCES/kf2-srv index 70b4e21..14f29c6 100755 --- a/SOURCES/kf2-srv +++ b/SOURCES/kf2-srv @@ -18,24 +18,14 @@ # along with this program. If not, see . source /etc/steamcmd/steamcmd.conf -source /etc/kf2-srv/kf2-srv.conf ScriptFullname=$(readlink -e "$0") ScriptName=$(echo "$ScriptFullname" | awk -F '/' '{print $NF;}') -ScriptVersion="0.6.0" +ScriptVersion="0.7.0" AppServerNum="232130" AppClientNum="232090" 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') WaveArray=('4' '7' '10') @@ -52,7 +42,8 @@ function show_help () echo "$ScriptName v$ScriptVersion" echo "Централизование управление серверами Killing Floor 2" echo "Usage:" - echo "$ScriptName OPTIONS" + echo "${ScriptName} OPTIONS stable branch" + echo "${ScriptName}-beta OPTIONS beta branch" echo "" echo "Mandatory arguments to long options are mandatory for short options too." echo " -n, --new INSTANCE создает новый ЭКЗЕМПЛЯР сервера" @@ -113,8 +104,12 @@ function show_help () # Use this function with non-root user only!!! function run_as_root () # $*: Args { + if [[ -n "$BetaPostfix" ]]; then + BetaPostfix="beta" + fi + if [[ -n $(groups "$USER" | grep -Fo 'wheel') ]]; then - sudo "$ScriptFullname" $* + sudo "$ScriptFullname" $BetaPostfix $* else echo "You must be root or sudo-user to run this command." return 1 @@ -126,7 +121,7 @@ function service_name () # $*: Instance[s] local Services="" for Instance in $* do - Services+=" kf2-srv@$Instance.service" + Services+=" kf2-srv$BetaPostfix@$Instance.service" done echo "$Services" } @@ -159,7 +154,7 @@ function instance_exists () # $1: Instance function server_exists () { - if [[ -n $(ls "$InstallDir") ]]; then + if [[ -x "$AppBin" ]]; then return 0 else return 1 @@ -168,8 +163,21 @@ function server_exists () function updates_aviable () { - # TODO: implementation - return 0 + # TODO: check + 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] @@ -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/-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 } @@ -330,12 +338,11 @@ function show_status () # $*: [InstanceName[s]] function validate () { - if [[ -n "$BranchName" ]]; then - local BetaArg="-beta $BranchName" + if [[ -n "$BetaPostfix" ]]; then + local BetaArg="-beta preview" fi stop_instance steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg validate +exit - echo "$BranchName" > "$ActiveBranch" start_instance } @@ -392,13 +399,43 @@ function fix_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 () { - if [[ -n "$BranchName" ]]; then - local BetaArg="-beta $BranchName" + if [[ -n "$BetaPostfix" ]]; then + local BetaArg="-beta preview" fi if ! server_exists; then # First install - echo "$BranchName" > "$ActiveBranch" if ! steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg validate +exit; then echo "Errors during installation - exit" exit 1 @@ -419,22 +456,18 @@ function update_kf2 () break fi sleep 2 + # TODO: KFWeb.ini > webadmin=true done killall -KILL KFGameSteamServer.bin.x86_64 - set_ini_permissions "$DefaultConfigDir" - install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$CacheMapsDir" + create_map_dirs fix_steamclient_so ln -s "$InstanceConfigDir" "$InstanceConfigLnk" make_default_instance echo "KF2 succesfully installed" elif updates_aviable; then # Update - if [[ "$BranchName" == $(cat "$ActiveBranch") ]]; then - stop_instance - steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg +exit - start_instance - else - validate - fi + stop_instance + steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg +exit + start_instance fi } @@ -687,7 +720,7 @@ function map_sync () do if instance_exists "$Instance"; then 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 MapName=$(echo "$MapFile" | sed -r 's|.kfm$||g') if [[ ! -f "$Config" ]]; then @@ -883,6 +916,19 @@ function ban_sync () 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 case $1 in -h|--help ) show_help; ;; diff --git a/SOURCES/kf2-srv-beta b/SOURCES/kf2-srv-beta new file mode 100644 index 0000000..9410b0b --- /dev/null +++ b/SOURCES/kf2-srv-beta @@ -0,0 +1,3 @@ +#!/bin/bash + +/usr/bin/kf2-srv beta $* diff --git a/SOURCES/kf2-srv-beta-update.service b/SOURCES/kf2-srv-beta-update.service new file mode 100644 index 0000000..bd615aa --- /dev/null +++ b/SOURCES/kf2-srv-beta-update.service @@ -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 diff --git a/SOURCES/kf2-srv-beta-update.timer b/SOURCES/kf2-srv-beta-update.timer new file mode 100644 index 0000000..db4e826 --- /dev/null +++ b/SOURCES/kf2-srv-beta-update.timer @@ -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 diff --git a/SOURCES/kf2-srv-beta@.service b/SOURCES/kf2-srv-beta@.service new file mode 100644 index 0000000..7895fdd --- /dev/null +++ b/SOURCES/kf2-srv-beta@.service @@ -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 diff --git a/SOURCES/kf2-srv-update.timer b/SOURCES/kf2-srv-update.timer index b6ce218..153bd5c 100644 --- a/SOURCES/kf2-srv-update.timer +++ b/SOURCES/kf2-srv-update.timer @@ -2,7 +2,7 @@ Description=Check and Update killing Floor 2 job [Timer] -OnCalendar=Wed, 04:00 +OnCalendar=*-*-* 4:00:00 Unit=kf2-srv-update.service [Install] diff --git a/SPECS/kf2-srv.spec b/SPECS/kf2-srv.spec index fd2b10a..798596b 100644 --- a/SPECS/kf2-srv.spec +++ b/SPECS/kf2-srv.spec @@ -1,7 +1,7 @@ %global steamuser steam Name: kf2-srv -Version: 0.6.0 +Version: 0.7.0 Release: 1%{dist} Summary: Killing Floor 2 server Group: Amusements/Games @@ -9,17 +9,28 @@ License: GNU GPLv3 BuildArch: noarch Source1: %{name} -Source2: %{name}.conf +Source2: %{name}-beta Source3: %{name}.xml Source4: %{name}@.service Source5: %{name}-update.service Source6: %{name}-update.timer Source7: main.conf.template +Source8: %{name}-beta@.service +Source9: %{name}-beta-update.service +Source10: %{name}-beta-update.timer Requires: systemd >= 219 Requires: steamcmd Requires: libxml2 Requires: dos2unix +Requires: curl +Requires: grep +Requires: coreutils +Requires: sed +Requires: util-linux +Requires: sudo +Requires: psmisc +Requires: gawk 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/firewalld/services 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}-beta -install -m 755 %{SOURCE1} %{buildroot}/%{_bindir} -install -m 644 %{SOURCE2} %{buildroot}/%{_sysconfdir}/%{name} -install -m 644 %{SOURCE3} %{buildroot}/%{_prefix}/lib/firewalld/services -install -m 644 %{SOURCE4} %{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 %{SOURCE7} %{buildroot}/%{_sysconfdir}/%{name} - -sed -i -r "s|^(InstallDir=).*$|\1\"%{_prefix}/games/%{name}\"|g" %{buildroot}/%{_bindir}/%{name} +install -m 755 %{SOURCE1} %{buildroot}/%{_bindir} +install -m 644 %{SOURCE2} %{buildroot}/%{_bindir} +install -m 644 %{SOURCE3} %{buildroot}/%{_prefix}/lib/firewalld/services +install -m 644 %{SOURCE4} %{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 %{SOURCE7} %{buildroot}/%{_sysconfdir}/%{name} +install -m 644 %{SOURCE8} %{buildroot}/%{_prefix}/lib/systemd/system +install -m 644 %{SOURCE9} %{buildroot}/%{_prefix}/lib/systemd/system +install -m 644 %{SOURCE10} %{buildroot}/%{_prefix}/lib/systemd/system %clean rm -rf $RPM_BUILD_ROOT %files %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}/instances -%attr(644,root,root) %{_sysconfdir}/%{name}/main.conf.template -%attr(644,root,root) %config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf +%attr(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/instances-beta +%attr(644,root,root) %config(noreplace) %{_sysconfdir}/%{name}/main.conf.template %attr(644,root,root) %config(noreplace) %{_prefix}/lib/firewalld/services/%{name}.xml %attr(755,root,root) %{_bindir}/%{name} +%attr(755,root,root) %{_bindir}/%{name}-beta %attr(644,root,root) %{_prefix}/lib/systemd/system/* %preun @@ -67,9 +83,17 @@ if [[ $1 -eq 0 ]] ; then # Uninstall %{_bindir}/%{name} --stop %{_bindir}/%{name} --disable 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 %changelog +* Sat Mar 7 2020 GenZmeY - 0.7.0-1 +- dual versions support; +- check updates; +- bugfixes. + * Sat Jan 18 2020 GenZmeY - 0.6.0-1 - versions; - instance conf tweaks;