Compare commits

..

18 Commits

Author SHA1 Message Date
5fa12d821b update spec for new version 2020-09-21 05:43:37 +03:00
ab8b757a8d command descriptions 2020-09-21 05:41:30 +03:00
31167e6f7a remove kf2-srv-force-attr 2020-09-09 14:17:46 +03:00
8f34f6fa95 feat: log cmd group 2020-09-09 14:06:35 +03:00
9865447789 fixed broken update. 2020-09-03 12:43:06 +03:00
dddab7f478 fixed failed instance stop 2020-08-20 00:13:31 +03:00
5630438624 refactor: replaced steamID3/steamID64 conversation algorithm 2020-08-17 01:12:51 +03:00
57006c867e fix 'find: Failed to restore initial working directory' 2020-08-15 15:32:10 +03:00
0f935c2faa fix: bashcomp
- fix bash completion for commands without parameters;
- fix bash completion for use not existing command group.
2020-08-15 15:05:37 +03:00
07043dd2b2 Merge branch 'master' of https://github.com/GenZmeY/kf2-srv 2020-08-14 15:04:08 +03:00
c1429905d9 day fix 2020-08-14 15:02:41 +03:00
878f1a1ab0 fix: bash completion for kf2-srv-beta. 2020-08-14 14:59:43 +03:00
1e610e9b9f Update README.md 2020-08-13 06:01:21 +03:00
bc2551bfa0 Update README.md 2020-08-13 05:59:24 +03:00
ea649350fc Update TODO 2020-08-13 05:51:28 +03:00
d56d4c27e8 Merge branch 'master' of https://github.com/GenZmeY/kf2-srv 2020-08-13 05:46:14 +03:00
fb516a4266 Update README.md 2020-08-10 14:50:22 +03:00
49995868dd Update README.md
- add badges (some badges will start working when the repository becomes public)
- readme template
2020-08-10 14:49:09 +03:00
43 changed files with 336 additions and 156 deletions

View File

@ -46,7 +46,6 @@ builddep:
prep: clean-tmp prep: clean-tmp
cd $(SOURCESDIR) && tar czf $(SOURCETARBALL) \ cd $(SOURCESDIR) && tar czf $(SOURCETARBALL) \
config \ config \
force-attr \
main \ main \
COPYING \ COPYING \
Makefile Makefile
@ -83,11 +82,11 @@ check-activate:
clean-tmp: clean-tmp:
rm -rf $(BUILDDIR) rm -rf $(BUILDDIR)
rm -rf $(BUILDROOTDIR) rm -rf $(BUILDROOTDIR)
rm -rf $(SOURCETARBALL) rm -f $(SOURCETARBALL)
clean-pkg: clean-pkg:
rm -rf $(RPMSDIR) rm -rf $(RPMSDIR)
rm -rf $(SRPMSDIR) rm -rf $(SRPMSDIR)
clean: clean-tmp clean-pkg clean: clean-tmp clean-pkg
rm -f $(SOURCESDIR)/$(NAME)-*.tar.gz

View File

@ -1,2 +1,24 @@
# kf2-srv # kf2-srv
Killing Floor 2 server tool for RHEL/CentOS 8 *Killing Floor 2 server tool for RHEL8/CentOS8*
[![build release](https://github.com/GenZmeY/kf2-srv/workflows/build%20release/badge.svg)](https://github.com/GenZmeY/kf2-srv/actions?query=workflow%3A%22build+release%22)
[![tests (master)](https://github.com/GenZmeY/kf2-srv/workflows/tests%20(master)/badge.svg?branch=master)](https://github.com/GenZmeY/kf2-srv/actions?query=workflow%3A%22tests+%28master%29%22)
[![tests (dev)](https://github.com/GenZmeY/kf2-srv/workflows/tests%20(dev)/badge.svg?branch=dev)](https://github.com/GenZmeY/kf2-srv/actions?query=workflow%3A%22tests+%28dev%29%22)
[![GitHub release](https://img.shields.io/github/v/release/genzmey/kf2-srv)](https://github.com/genzmey/kf2-srv/releases/latest)
[![GitHub Release Date](https://img.shields.io/github/release-date/genzmey/kf2-srv)](https://github.com/genzmey/kf2-srv/releases/latest)
# Features
...
# Build
...
# Install
...
# Usage
...
# License
![GitHub](https://img.shields.io/github/license/genzmey/kf2-srv)
...

View File

@ -60,13 +60,11 @@ build:
cp -r $(SOURCEDIR)/main $(RELEASEDIR) cp -r $(SOURCEDIR)/main $(RELEASEDIR)
cp -r $(SOURCEDIR)/config $(RELEASEDIR) cp -r $(SOURCEDIR)/config $(RELEASEDIR)
cp -r $(SOURCEDIR)/force-attr $(RELEASEDIR)
find $(RELEASEDIR) -type f -exec sed -i 's|:DEFINE_PREFIX:|$(PREFIX)|g;' {} \; find $(RELEASEDIR) -type f -exec sed -i 's|:DEFINE_PREFIX:|$(PREFIX)|g;' {} \;
fake-systemd-build: fake-systemd-build:
find $(SOURCEDIR)/main -type f -name '*.service' -exec cp -f {} $(RELEASEDIR)/{} \; find $(SOURCEDIR)/main -type f -name '*.service' -exec cp -f {} $(RELEASEDIR)/{} \;
find $(SOURCEDIR)/force-attr -type f -name '*.service' -exec cp -f {} $(RELEASEDIR)/{} \;
find $(RELEASEDIR) -type f -exec sed -i 's|:DEFINE_PREFIX:|$(DESTDIR)$(PREFIX)|g;' {} \; find $(RELEASEDIR) -type f -exec sed -i 's|:DEFINE_PREFIX:|$(DESTDIR)$(PREFIX)|g;' {} \;
find $(RELEASEDIR) -type f -exec sed -i -r 's|ExecStart=.+KFGameSteamServer.bin.x86_64|ExecStart=/bin/bash|g;' {} \; find $(RELEASEDIR) -type f -exec sed -i -r 's|ExecStart=.+KFGameSteamServer.bin.x86_64|ExecStart=/bin/bash|g;' {} \;
@ -122,9 +120,6 @@ install: filesystem build
install -m 644 $(RELEASEDIR)/main/logrotate/$(NAME) $(LOGROTATEDIR) install -m 644 $(RELEASEDIR)/main/logrotate/$(NAME) $(LOGROTATEDIR)
install -m 644 $(RELEASEDIR)/main/rsyslog/$(NAME).conf $(RSYSLOGDIR) install -m 644 $(RELEASEDIR)/main/rsyslog/$(NAME).conf $(RSYSLOGDIR)
install -m 755 $(RELEASEDIR)/force-attr/$(NAME)-force-attr $(SBINDIR)
install -m 644 $(RELEASEDIR)/force-attr/systemd/$(NAME)-force-attr.service $(UNITDIR)
install -m 640 $(RELEASEDIR)/config/bot.conf $(CONFDIR) install -m 640 $(RELEASEDIR)/config/bot.conf $(CONFDIR)
install -m 644 $(RELEASEDIR)/config/instance.conf.template $(CONFDIR) install -m 644 $(RELEASEDIR)/config/instance.conf.template $(CONFDIR)
install -m 644 $(RELEASEDIR)/config/$(NAME).conf $(CONFDIR) install -m 644 $(RELEASEDIR)/config/$(NAME).conf $(CONFDIR)
@ -148,9 +143,6 @@ uninstall:
rm -f $(LOGROTATEDIR)/$(NAME) rm -f $(LOGROTATEDIR)/$(NAME)
rm -f $(RSYSLOGDIR)/$(NAME).conf rm -f $(RSYSLOGDIR)/$(NAME).conf
rm -f $(SBINDIR)/$(NAME)-force-attr
rm -f $(UNITDIR)/$(NAME)-force-attr.service
rm -rf $(LICENSEDIR) rm -rf $(LICENSEDIR)
rm -rf $(KF2MAINDIR) rm -rf $(KF2MAINDIR)
rm -rf $(KF2BETADIR) rm -rf $(KF2BETADIR)
@ -165,11 +157,9 @@ test: fake-systemd-build
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-beta-update.timer $(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-beta-update.timer
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-update.service $(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-update.service
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-update.timer $(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-update.timer
$(SYSTEMDCHECK) $(RELEASEDIR)/force-attr/systemd/$(NAME)-force-attr.service
$(BASHCHECK) $(RELEASEDIR)/main/$(NAME) $(BASHCHECK) $(RELEASEDIR)/main/$(NAME)
$(BASHCHECK) $(RELEASEDIR)/main/$(NAME)-beta $(BASHCHECK) $(RELEASEDIR)/main/$(NAME)-beta
$(BASHCHECK) $(RELEASEDIR)/force-attr/$(NAME)-force-attr
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/list $(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/list
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/add $(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/add
@ -196,6 +186,8 @@ test: fake-systemd-build
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/add $(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/add
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/delete $(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/delete
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/sync $(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/sync
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/log/cat
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/log/tail
$(BASHCHECK) $(RELEASEDIR)/main/lib/ban.lib $(BASHCHECK) $(RELEASEDIR)/main/lib/ban.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/game.lib $(BASHCHECK) $(RELEASEDIR)/main/lib/game.lib
@ -205,6 +197,7 @@ test: fake-systemd-build
$(BASHCHECK) $(RELEASEDIR)/main/lib/playerids.lib $(BASHCHECK) $(RELEASEDIR)/main/lib/playerids.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/webadmin.lib $(BASHCHECK) $(RELEASEDIR)/main/lib/webadmin.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/workshop.lib $(BASHCHECK) $(RELEASEDIR)/main/lib/workshop.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/log.lib
$(BASHCHECK) $(RELEASEDIR)/main/bash_completion/$(NAME) $(BASHCHECK) $(RELEASEDIR)/main/bash_completion/$(NAME)

View File

@ -25,10 +25,7 @@ MutNames['KFMutator.KFMutator_MaxPlayersV2']='MaxPlayers'
MutNames['ClassicScoreboard.ClassicSCMut']='ClassicSC' MutNames['ClassicScoreboard.ClassicSCMut']='ClassicSC'
MutNames['ZedCustom.ZedCustomMut']='ZedVarients' MutNames['ZedCustom.ZedCustomMut']='ZedVarients'
# These parameters are used when creating new instances. # These parameters are used when creating new instances and in the command "kf2-srv game fix-permissions"
# In order for the parameters to be applied to the files that the working server creates, the "kf2-srv-force-attr.service" must be active. IniPermissions=664
ForceIniPermissions=664 IniGroup=steam
ForceLogPermissions=644
ForceIniGroup=steam
ForceLogGroup=steam

View File

@ -1,18 +0,0 @@
[Unit]
Description=kf2-srv force attr service
[Service]
Type=simple
StandardOutput=null
StandardError=null
ExecStart=:DEFINE_PREFIX:/sbin/kf2-srv-force-attr
Restart=always
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=true
[Install]
WantedBy=multi-user.target

View File

@ -19,36 +19,33 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
function _kf2_srv_completions () # $1: BetaPostfix function _kf2_srv_completions ()
{ {
local GrpDir=":DEFINE_PREFIX:/share/kf2-srv/cmdgrp"
local InsDir="/etc/kf2-srv/instances${BetaPostfix}"
local KF2Srv=":DEFINE_PREFIX:/bin/kf2-srv${BetaPostfix}"
function groups_list () function groups_list ()
{ {
find "$GrpDir" \ find "$GrpDir" \
-mindepth 1 \ -mindepth 1 \
-maxdepth 1 \ -maxdepth 1 \
-type d \ -type d \
-printf "%f\n" -printf "%f\n"
} }
function commands_list () # $1: Command group function commands_list () # $1: Command group
{ {
find "$GrpDir/$1" \ test -d "$GrpDir/$1" && \
-mindepth 1 \ find "$GrpDir/$1" \
-maxdepth 1 \ -mindepth 1 \
-type f \ -maxdepth 1 \
-type f \
-printf "%f\n" -printf "%f\n"
} }
function instances_list () function instances_list ()
{ {
find "$InsDir" \ find "$InsDir" \
-mindepth 1 \ -mindepth 1 \
-maxdepth 1 \ -maxdepth 1 \
-type d \ -type d \
-printf "%f\n" -printf "%f\n"
} }
@ -88,11 +85,24 @@ function _kf2_srv_completions () # $1: BetaPostfix
return 0 return 0
} }
function _kf2_srv_beta_completions () function _kf2_srv_main_completions ()
{ {
_kf2_srv_completions "-beta" local GrpDir=":DEFINE_PREFIX:/share/kf2-srv/cmdgrp"
local InsDir="/etc/kf2-srv/instances"
local KF2Srv=":DEFINE_PREFIX:/bin/kf2-srv"
_kf2_srv_completions
} }
complete -F _kf2_srv_completions kf2-srv function _kf2_srv_beta_completions ()
{
local GrpDir=":DEFINE_PREFIX:/share/kf2-srv/cmdgrp"
local InsDir="/etc/kf2-srv/instances-beta"
local KF2Srv=":DEFINE_PREFIX:/bin/kf2-srv-beta"
_kf2_srv_completions
}
complete -F _kf2_srv_main_completions kf2-srv
complete -F _kf2_srv_beta_completions kf2-srv-beta complete -F _kf2_srv_beta_completions kf2-srv-beta

View File

@ -35,7 +35,8 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "Id can be SteamID3, SteamID64 or a link to a user profile."
echo "EGS players are not supported."
} }
function cmd_main () # $*: ban list function cmd_main () # $*: ban list

View File

@ -35,7 +35,8 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "Id can be SteamID3, SteamID64 or a link to a user profile."
echo "EGS players are not supported."
} }
function cmd_main () # $*: ban list function cmd_main () # $*: ban list

View File

@ -33,10 +33,10 @@ function cmd_info ()
echo "Show the list of blocked users" echo "Show the list of blocked users"
} }
function cmd_help () #function cmd_help ()
{ #{
echo "TODO: description" # echo ""
} #}
function cmd_main () function cmd_main ()
{ {

View File

@ -33,10 +33,10 @@ function cmd_info ()
echo "Sync blocklist for all servers" echo "Sync blocklist for all servers"
} }
function cmd_help () #function cmd_help ()
{ #{
echo "TODO: description" # echo ""
} #}
function cmd_main () function cmd_main ()
{ {

View File

@ -35,7 +35,10 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "By default, all files created by the kf2 server"
echo "have 600 permissions, which can be inconvenient."
echo "This command fixes the permissions and groups of"
echo "all ini files to the values specified in kf2-srv.conf"
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "Run the server binary directly, without systemd or anything else."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,8 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "Stops all running server instances, installs updates (if any)"
echo "When finished, starts all enabled instances."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,8 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "Stops all running server instances, validate server files."
echo "When finished, starts all enabled instances."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "Name(s) must not contain spaces."
} }
function cmd_main () function cmd_main ()

View File

@ -30,12 +30,12 @@ function cmd_usage ()
function cmd_info () function cmd_info ()
{ {
echo "Send message to specified server instances" echo "Send message to specified server instance(s)"
} }
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, sends a message to all running servers."
} }
function cmd_main () function cmd_main ()

View File

@ -19,8 +19,8 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
cmd_need_superuser () { false ;} cmd_need_superuser () { true ;}
cmd_need_steamuser () { true ;} cmd_need_steamuser () { false ;}
cmd_need_installed_server () { false ;} cmd_need_installed_server () { false ;}
function cmd_usage () function cmd_usage ()
@ -30,12 +30,12 @@ function cmd_usage ()
function cmd_info () function cmd_info ()
{ {
echo "Delete the specified server instances" echo "Delete the specified server instance(s)"
} }
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, deletes all server instances."
} }
function cmd_main () function cmd_main ()

View File

@ -30,12 +30,12 @@ function cmd_usage ()
function cmd_info () function cmd_info ()
{ {
echo "Disable specified server instance(s)" echo "Disable autostart for specified server instance(s)"
} }
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, disable autostart for all instances."
} }
function cmd_main () function cmd_main ()

View File

@ -30,12 +30,12 @@ function cmd_usage ()
function cmd_info () function cmd_info ()
{ {
echo "Enable specified server instance(s)" echo "Enable autostart for specified server instance(s)"
} }
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, disable autostart for all instances."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, displays the status of all instances."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, restarts all enabled instances."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, starts all enabled instances."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, stops all instances."
} }
function cmd_main () function cmd_main ()

View File

@ -19,25 +19,29 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
declare -A ModeNames MutNames cmd_need_superuser () { false ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { true ;}
source "/etc/kf2-srv/kf2-srv.conf" function cmd_usage ()
{
echo "[<instance>...]"
}
DirLog="/var/log/kf2-srv" function cmd_info ()
DirLogBeta="/var/log/kf2-srv-beta" {
DirInstances="/etc/kf2-srv/instances" echo "Print in stdout full log of specified server instance(s)"
DirInstancesBeta="/etc/kf2-srv/instances-beta" }
/usr/bin/inotifywait -qmr -e create -e moved_to --format %w%f \ function cmd_help ()
"$DirLog" "$DirLogBeta" "$DirInstances" "$DirInstancesBeta" | \ {
while read File echo "If instance is not specified, prints the log of all instances."
do }
if echo "$File" | grep -Piq "\.log$"; then
chmod "$ForceLogPermissions" "$File" function cmd_main ()
chown :"$ForceLogGroup" "$File" {
elif echo "$File" | grep -Piq "\.ini$"; then include "$LibDir/log.lib"
chmod "$ForceIniPermissions" "$File"
chown :"$ForceIniGroup" "$File" log_cat "$@"
fi }
done

View File

@ -0,0 +1,47 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019, 2020 GenZmeY
# mailto: genzmey@gmail.com
#
# This file is part of kf2-srv.
#
# kf2-srv is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
cmd_need_superuser () { false ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Print in stdout tail log of specified server instance(s) in real time"
}
function cmd_help ()
{
echo "If instance is not specified, prints the log of all instances in real time."
}
function cmd_main ()
{
include "$LibDir/log.lib"
log_tail "$@"
}

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, load map rotation for all instances."
} }
function cmd_main () # $*: Instance[s] function cmd_main () # $*: Instance[s]

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, save map rotation for all instances."
} }
function cmd_main () # $*: Instance[s] function cmd_main () # $*: Instance[s]

View File

@ -35,7 +35,9 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, set a admin password for all instances."
echo "To remove a password, use an empty password as an argument,"
echo "example: ${ScriptFullname}${KF2POSTFIX} password admin '' test_instance"
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,9 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "If instance is not specified, set a game password for all instances."
echo "To remove a password, use an empty password as an argument,"
echo "example: ${ScriptFullname}${KF2POSTFIX} password game '' test_instance"
} }
function cmd_main () function cmd_main ()

View File

@ -25,7 +25,7 @@ cmd_need_installed_server () { false ;}
function cmd_usage () function cmd_usage ()
{ {
echo "[<workshop_id>...]" echo "<workshop_id>..."
} }
function cmd_info () function cmd_info ()
@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "workshop_id can be a resource ID or a link to a resource in workshop."
} }
function cmd_main () function cmd_main ()

View File

@ -35,7 +35,7 @@ function cmd_info ()
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "workshop_id can be a resource ID or a link to a resource in workshop."
} }
function cmd_main () function cmd_main ()

View File

@ -33,10 +33,10 @@ function cmd_info ()
echo "Show the list of steam workshop resources" echo "Show the list of steam workshop resources"
} }
function cmd_help () #function cmd_help ()
{ #{
echo "TODO: description" # echo ""
} #}
function cmd_main () function cmd_main ()
{ {

View File

@ -30,12 +30,13 @@ function cmd_usage ()
function cmd_info () function cmd_info ()
{ {
echo "Sync steamorkshop resources between all server instances" echo "Sync steam workshop resources between all server instances"
} }
function cmd_help () function cmd_help ()
{ {
echo "TODO: description" echo "In addition to synchronization, adds loaded maps and mutators to KFGame.ini."
echo "This command works for stopped server instances only."
} }
function cmd_main () function cmd_main ()

View File

@ -43,7 +43,7 @@ readonly InstanceConfigTemplate="/etc/kf2-srv/instance.conf.template"
readonly AppServerNum="232130" readonly AppServerNum="232130"
readonly AppClientNum="232090" readonly AppClientNum="232090"
readonly StrangeConstUID="17825793" readonly SteamConstB='17825793'
readonly ServerBotLogin="srvbot" readonly ServerBotLogin="srvbot"
declare -a DiffNames declare -a DiffNames
@ -67,7 +67,7 @@ function run_as_steamuser () # $@: command
shift 3; cmd_main "$@" shift 3; cmd_main "$@"
elif [[ -n $(groups "$(whoami)" | grep -Fo 'wheel') ]] || [[ "$(whoami)" == "root" ]]; then elif [[ -n $(groups "$(whoami)" | grep -Fo 'wheel') ]] || [[ "$(whoami)" == "root" ]]; then
export INC_LIBS="" export INC_LIBS=""
sudo -u "$SteamUser" "$@" sudo -iu "$SteamUser" "$@"
else else
echo "You must be a $SteamUser, root or sudo-user to run this command." echo "You must be a $SteamUser, root or sudo-user to run this command."
fi fi
@ -79,7 +79,7 @@ function run_as_root () # $@: command
shift 3; cmd_main "$@" shift 3; cmd_main "$@"
elif [[ -n $(groups "$(whoami)" | grep -Fo 'wheel') ]]; then elif [[ -n $(groups "$(whoami)" | grep -Fo 'wheel') ]]; then
export INC_LIBS="" export INC_LIBS=""
sudo "$@" sudo -i "$@"
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."
fi fi
@ -197,10 +197,22 @@ elif [[ -d "$GroupPathname" ]]; then
shift shift
source "$CommandPathName" source "$CommandPathName"
if is_help "$1"; then if is_help "$1"; then
if function_exists "cmd_help"; then if ! function_exists "cmd_usage" \
cmd_help && ! function_exists "cmd_info" \
else && ! function_exists "cmd_help"; then
echo "No help page for this command." echo "No help page for this command."
else
if function_exists "cmd_usage"; then
echo "usage: $(cmd_usage)"
echo
fi
if function_exists "cmd_info"; then
cmd_info
echo
fi
if function_exists "cmd_help"; then
cmd_help
fi
fi fi
elif is_usage "$1"; then elif is_usage "$1"; then
if function_exists "cmd_usage"; then if function_exists "cmd_usage"; then

View File

@ -108,7 +108,7 @@ function ban_ID3 () # $1: ID3
do do
( (
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini" local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local BanStr="(Uid=(A=$ID3,B=$StrangeConstUID))" local BanStr="(Uid=(A=$ID3,B=$SteamConstB))"
local Service=$(service_name "$Instance") local Service=$(service_name "$Instance")
if ! multini -gq "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr"; then if ! multini -gq "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr"; then
echo "Add ban $ID3 to $Instance" echo "Add ban $ID3 to $Instance"
@ -137,7 +137,7 @@ function unban_ID3 () # $1: ID3
do do
( (
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini" local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local BanStr="(Uid=(A=$ID3,B=$StrangeConstUID))" local BanStr="(Uid=(A=$ID3,B=$SteamConstB))"
local Service=$(service_name "$Instance") local Service=$(service_name "$Instance")
if systemctl -q is-active $Service ; then if systemctl -q is-active $Service ; then
local PlainID=0 local PlainID=0

View File

@ -39,7 +39,7 @@ function fix_ini_permissions () # $1: Dir
find "$1" \( -type l -o -type f \) -name '*.ini' | \ find "$1" \( -type l -o -type f \) -name '*.ini' | \
xargs --max-procs=$(nproc) -I {} \ xargs --max-procs=$(nproc) -I {} \
sh -c "chmod $ForceIniPermissions {}; chown $SteamUser:$ForceIniGroup {}" sh -c "chmod $IniPermissions {}; chown $SteamUser:$IniGroup {}"
} }
function game_run () # $@: Game args function game_run () # $@: Game args
@ -255,9 +255,9 @@ function make_default_instance () # $1: Dir
local InstanceDir="$InstanceConfigDir/default" local InstanceDir="$InstanceConfigDir/default"
install -d -g "$SteamUser" -o "$ForceIniGroup" -m 775 "$InstanceDir" install -d -g "$SteamUser" -o "$IniGroup" -m 775 "$InstanceDir"
install -d -g "$SteamUser" -o "$ForceIniGroup" -m 775 "$InstanceDir/LinuxServer" install -d -g "$SteamUser" -o "$IniGroup" -m 775 "$InstanceDir/LinuxServer"
install -g "$SteamUser" -o "$ForceIniGroup" -m $ForceIniPermissions "$InstanceConfigTemplate" "$InstanceDir/instance.conf" install -g "$SteamUser" -o "$IniGroup" -m $IniPermissions "$InstanceConfigTemplate" "$InstanceDir/instance.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/KFWebAdmin.ini" "$InstanceDir/KFWebAdmin.ini"

View File

@ -90,8 +90,8 @@ function instance_add () # $*: InstanceName[s]
local InstanceDir="$InstanceConfigDir/$Instance" local InstanceDir="$InstanceConfigDir/$Instance"
local DirMode="-d -g $SteamUser -o $ForceIniGroup -m 775" local DirMode="-d -g $SteamUser -o $IniGroup -m 775"
local FileMode=" -g $SteamUser -o $ForceIniGroup -m $ForceIniPermissions" local FileMode=" -g $SteamUser -o $IniGroup -m $IniPermissions"
install $DirMode "$InstanceDir" install $DirMode "$InstanceDir"
install $DirMode "$InstanceDir/LinuxServer" install $DirMode "$InstanceDir/LinuxServer"

75
SOURCES/main/lib/log.lib Normal file
View File

@ -0,0 +1,75 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019, 2020 GenZmeY
# mailto: genzmey@gmail.com
#
# This file is part of kf2-srv.
#
# kf2-srv is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
function log_cat () # $*: InstanceName[s]
{
include "$LibDir/instance.lib"
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
local Logs
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
local Service=$(service_name "$Instance")
Logs+="-u $Service "
else
echo "Instance $Instance not exitst"
fi
done
if [[ -z "$Logs" ]]; then
echo "No logs available."
else
journalctl --no-pager $Logs
fi
}
function log_tail () # $*: InstanceName[s]
{
include "$LibDir/instance.lib"
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
local Logs
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
local Service=$(service_name "$Instance")
Logs+="-u $Service "
else
echo "Instance $Instance not exitst"
fi
done
if [[ -z "$Logs" ]]; then
echo "No logs available."
else
echo "Hint: use Ctrl+C to stop output"
journalctl --no-pager -f $Logs
fi
}

View File

@ -19,35 +19,42 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# conversion algorithm taken from here: # WARNING:
# https://github.com/noobient/killinuxfloor/blob/master/share/killinuxfloor # Conversion works correctly for positive A/B for EGS,
# thank bviktor for that :) # but still gives incorrect results if there are negative ones
function steamID3_to_steamID64 () # $1: ID3
function steamID3_to_steamID64 () # $1: ID3 (A), $2: B
{ {
# steamID64 = "7656" + (steamID3 + 1197960265728) local ID3="$1"
ID64=$1 if [[ -z $2 ]]; then
((ID64+=1197960265728)) local B="$SteamConstB"
ID64="7656${ID64}" else
echo "$ID64" local B="$2"
fi
# SteamID64=B*2^32+SteamID3
echo $(($B*(2**32)+$ID3))
} }
function steamID64_to_steamID3 () # $1: ID4 function steamID64_to_steamID3 () # $1: ID64, $2: B
{ {
# steamID3 = substr(steamID64, 4) - 1197960265728 local ID64="$1"
ID3=${1:4} if [[ -z $2 ]]; then
((ID3-=1197960265728)) local B="$SteamConstB"
echo "$ID3" else
local B="$2"
fi
# SteamID3=SteamID64-B*2^32
echo $(($ID64-$B*(2**32)))
} }
function any_to_ID3 () # $1: ID3/ID64/Url function any_to_ID3 () # $1: ID3/ID64/Url
{ {
if echo "$1" | grep -qP '^http.+'; then if echo "$1" | grep -qP '^http.+'; then
local Xml=$(mktemp) local ID64=$(curl -ss "$1/?xml=1" | xmllint --xpath 'string(//steamID64/text())' -)
curl -ss "$1/?xml=1" > "$Xml"
local ID64=$(xmllint --xpath 'string(//steamID64/text())' "$Xml")
local ID3=$(steamID64_to_steamID3 "$ID64") local ID3=$(steamID64_to_steamID3 "$ID64")
rm -f "$Xml" elif [[ $(echo "$1" | wc -m) -eq 18 ]] && echo "$1" | grep -qP '^7656[0-9]+' ; then
elif [[ $(echo "$1" | wc -m) -eq 18 ]] && echo "$1" | grep -qP '^76561[0-9]+' ; then
local ID3=$(steamID64_to_steamID3 "$1") local ID3=$(steamID64_to_steamID3 "$1")
else else
local ID3="$1" local ID3="$1"

View File

@ -2,9 +2,12 @@ global(parser.permitSlashInProgramName="on")
template(name="DynFile" type="string" string="/var/log/%programname%.log") template(name="DynFile" type="string" string="/var/log/%programname%.log")
# Change "UMask" in /usr/lib/systemd/system/rsyslog.service
# to make "FileCreateMode" and "Umask" work correctly for this config.
if ($programname startswith "kf2-srv") then if ($programname startswith "kf2-srv") then
{ {
action(Type="omfile" DynaFile="DynFile" FileCreateMode="0640" Umask="0027" FileOwner="root" FileGroup="steam") action(Type="omfile" DynaFile="DynFile" FileCreateMode="0644" Umask="0022" FileOwner="root" FileGroup="steam")
stop stop
} }

View File

@ -19,7 +19,7 @@ ExecStart=/bin/sleep 5m
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance chat 'Server shutting down...' ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance chat 'Server shutting down...'
ExecStart=/bin/sleep 5s ExecStart=/bin/sleep 5s
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance update ExecStart=:DEFINE_PREFIX:/bin/kf2-srv game update
PrivateTmp=true PrivateTmp=true
PrivateDevices=true PrivateDevices=true

View File

@ -1,7 +1,7 @@
%global steamuser steam %global steamuser steam
Name: kf2-srv Name: kf2-srv
Version: 0.15.0 Version: 0.16.0
Release: 1%{dist} Release: 1%{dist}
Summary: Killing Floor 2 server Summary: Killing Floor 2 server
Group: Amusements/Games Group: Amusements/Games
@ -74,7 +74,6 @@ rm -rf $RPM_BUILD_ROOT
%attr(0644,root,root) %config(noreplace) %{_prefix}/lib/firewalld/services/%{name}.xml %attr(0644,root,root) %config(noreplace) %{_prefix}/lib/firewalld/services/%{name}.xml
%attr(0755,root,root) %{_bindir}/%{name} %attr(0755,root,root) %{_bindir}/%{name}
%attr(0755,root,root) %{_bindir}/%{name}-beta %attr(0755,root,root) %{_bindir}/%{name}-beta
%attr(0755,root,root) %{_sbindir}/%{name}-force-attr
%attr(0644,root,root) %{_unitdir}/* %attr(0644,root,root) %{_unitdir}/*
%attr(0644,root,root) %doc %{_datadir}/licenses/%{name}/* %attr(0644,root,root) %doc %{_datadir}/licenses/%{name}/*
%attr(0644,root,root) %{_sysconfdir}/rsyslog.d/%{name}.conf %attr(0644,root,root) %{_sysconfdir}/rsyslog.d/%{name}.conf
@ -101,6 +100,25 @@ if [[ $1 == 1 ]]; then # Install
fi fi
%changelog %changelog
* Mon Sep 21 2020 GenZmeY <genzmey@gmail.com> - 0.16.0-1
- remove force-attr daemon;
- log cmg group;
- command descriptions.
* Sat Aug 15 2020 GenZmeY <genzmey@gmail.com> - 0.15.4-1
- fixed broken update;
- replaced steamID3/steamID64 conversation algorithm.
* Sat Aug 15 2020 GenZmeY <genzmey@gmail.com> - 0.15.3-1
- fix 'find: Failed to restore initial working directory'.
* Sat Aug 15 2020 GenZmeY <genzmey@gmail.com> - 0.15.2-1
- fix bash completion for commands without parameters;
- fix bash completion for use not existing command group.
* Fri Aug 14 2020 GenZmeY <genzmey@gmail.com> - 0.15.1-1
- fix bash completion for kf2-srv-beta.
* Thu Aug 13 2020 GenZmeY <genzmey@gmail.com> - 0.15.0-1 * Thu Aug 13 2020 GenZmeY <genzmey@gmail.com> - 0.15.0-1
- bash completion support. - bash completion support.

1
TODO
View File

@ -7,5 +7,4 @@
- ban history - ban history
- temporary ban - temporary ban
- generate unique password for server bot on install - generate unique password for server bot on install
- bash completion