Compare commits

...

No commits in common. "0.11.1-1" and "master" have entirely different histories.

75 changed files with 3987 additions and 1549 deletions

52
.github/workflows/build-release.yml vendored Normal file
View File

@ -0,0 +1,52 @@
name: build release
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+-[0-9]+'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v2
- name: build
uses: ./.github/workflows/docker
id: build
with:
target: 'all'
- name: create release
id: create_release
uses: actions/create-release@latest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
- name: upload srpm
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: /home/runner/work/kf2-srv/kf2-srv/SRPMS/${{ steps.build.outputs.srpm_name }}
asset_name: ${{ steps.build.outputs.srpm_name }}
asset_content_type: application/gzip
- name: upload rpm
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: /home/runner/work/kf2-srv/kf2-srv/RPMS/noarch/${{ steps.build.outputs.rpm_name }}
asset_name: ${{ steps.build.outputs.rpm_name }}
asset_content_type: application/gzip

7
.github/workflows/docker/Dockerfile vendored Normal file
View File

@ -0,0 +1,7 @@
FROM centos:8
RUN dnf install -y rpmdevtools dnf-utils make
COPY * /
ENTRYPOINT ["/entrypoint.sh"]

22
.github/workflows/docker/action.yml vendored Normal file
View File

@ -0,0 +1,22 @@
name: 'make'
description: 'make <target>'
inputs:
target:
description: 'make <target>'
required: true
default: ''
outputs:
rpm_name:
description: 'rpm name'
srpm_name:
description: 'src.rpm name'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.target }}

10
.github/workflows/docker/entrypoint.sh vendored Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh -l
make active && make builddep && make -j$(nproc) "$1"
RC=$?
echo "::set-output name=rpm_name::$(find /github/workspace/RPMS -type f -name '*.rpm' -printf '%f\n')"
echo "::set-output name=srpm_name::$(find /github/workspace/SRPMS -type f -name '*.src.rpm' -printf '%f\n')"
exit $RC

20
.github/workflows/tests-dev.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: tests (dev)
on:
push:
branches:
- dev
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v2
- name: run tests
uses: ./.github/workflows/docker
with:
target: 'test'

20
.github/workflows/tests-master.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: tests (master)
on:
push:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@v2
- name: run tests
uses: ./.github/workflows/docker
with:
target: 'test'

2
.gitignore vendored
View File

@ -2,4 +2,4 @@ RPMS/*
SRPMS/*
BUILD/*
BUILDROOT/*
SOURCES/*.tar.gz

92
Makefile Normal file
View File

@ -0,0 +1,92 @@
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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/>.
NAME := kf2-srv
RPMBUILDDIR := $$HOME/rpmbuild
ACTIVEDIR := $(shell readlink -e $$HOME/rpmbuild)
WORKDIR := $(shell readlink -e .)
BUILDDIR := $(WORKDIR)/BUILD
BUILDROOTDIR := $(WORKDIR)/BUILDROOT
RPMSDIR := $(WORKDIR)/RPMS
SOURCESDIR := $(WORKDIR)/SOURCES
SPECSDIR := $(WORKDIR)/SPECS
SRPMSDIR := $(WORKDIR)/SRPMS
SPEC := $(SPECSDIR)/$(NAME).spec
VERSION := $(shell grep -Fi 'Version:' $(SPEC) | awk '{ print $$2 }')
SOURCETARBALL := $(SOURCESDIR)/$(NAME)-$(VERSION).tar.gz
.PHONY: all prep rpm srpm activate active check-activate clean-tmp clean-pkg clean builddep test
all: check-activate prep
rpmbuild -ba $(SPEC)
$(MAKE) clean-tmp
builddep:
dnf builddep -y $(SPEC)
prep: clean-tmp
cd $(SOURCESDIR) && tar czf $(SOURCETARBALL) \
config \
main \
COPYING \
Makefile
rpm: check-activate prep
rpmbuild -bb $(SPEC)
$(MAKE) clean-tmp
srpm: check-activate prep
rpmbuild -bs $(SPEC)
$(MAKE) clean-tmp
test: check-activate prep
rpmbuild -bi $(SPEC)
$(MAKE) clean-tmp
active: activate
activate:
ifeq ($(shell test -L $(RPMBUILDDIR); echo $$?), 0)
rm -f $(RPMBUILDDIR)
else ifeq ($(shell test -d $(RPMBUILDDIR); echo $$?), 0)
mv -f $(RPMBUILDDIR) $(RPMBUILDDIR).old
else
rm -f $(RPMBUILDDIR)
endif
ln -s $(WORKDIR) $(RPMBUILDDIR)
check-activate:
ifneq ($(ACTIVEDIR), $(WORKDIR))
$(error project is not active)
endif
clean-tmp:
rm -rf $(BUILDDIR)
rm -rf $(BUILDROOTDIR)
rm -f $(SOURCETARBALL)
clean-pkg:
rm -rf $(RPMSDIR)
rm -rf $(SRPMSDIR)
clean: clean-tmp clean-pkg
rm -f $(SOURCESDIR)/$(NAME)-*.tar.gz

View File

@ -1,2 +1,33 @@
# kf2-srv
Killing Floor 2 server tool for RHEL/CentOS 7/8
# KF2-SRV
*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)
[![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)
![GitHub](https://img.shields.io/github/license/genzmey/KF2-SRV)
# Warning
There is not and most likely never will be a detailed manual. If you don't have sufficient knowledge of Linux in general and CentOS in particular, as well as the ability to learn unknown tools, you probably shouldn't use this.
# Usage
You can find actual rpm packages here(\*): https://github.com/GenZmeY/KF2-SRV/releases
And dependencies here: https://cloud.genzmey.su/index.php/s/3GiwtDpkNyCarXc
Basic usage information: https://github.com/GenZmeY/KF2-SRV/blob/master/SOURCES/README
\* inotify-tools requirement can be ignored
- Install packages `steamcmd-2018.01.05-5.el8.x86_64.rpm`, `multini-0.4.3-1.el8.x86_64.rpm`, `kf2-srv-0.18.1-1.el8.noarch.rpm`
- `kf2-srv game update` or `kf2-srv-beta game update`
- use `kf2-srv --help` or `kf2-srv <COMMAND> --help` to see the actions available to you and decide what to do next
**Filesystem:**
configs: `/etc/kf2-srv/`
game server: `/usr/games/kf2-srv`
game server (beta): `/usr/games/kf2-srv-beta`
cache: `/var/cache/kf2-srv`
logs: `/var/log/kf2-srv`
logs (beta): `/var/logs/kf2-srv`
# License
[GNU GPLv3](LICENSE)

214
SOURCES/Makefile Normal file
View File

@ -0,0 +1,214 @@
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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/>.
NAME := kf2-srv
SOURCEDIR := .
RELEASEDIR := $(SOURCEDIR)/release
DESTDIR =
PREFIX = /usr/local
MAINLOGDIR = $(DESTDIR)/var/log/$(NAME)
BETALOGDIR = $(DESTDIR)/var/log/$(NAME)-beta
CONFDIR = $(DESTDIR)/etc/$(NAME)
BASHCOMPDIR = $(DESTDIR)/etc/bash_completion.d
INSTMAINDIR = $(CONFDIR)/instances
INSTBETADIR = $(CONFDIR)/instances-beta
MAPCYCLEDIR = $(CONFDIR)/mapcycles
CACHEDIR = $(DESTDIR)/var/cache/$(NAME)
LOGROTATEDIR = $(DESTDIR)/etc/logrotate.d
RSYSLOGDIR = $(DESTDIR)/etc/rsyslog.d
UNITDIR = $(if $(DESTDIR),$(DESTDIR)/usr/lib/systemd/system,/etc/systemd/system)
FIREWALLDDIR = $(if $(DESTDIR),$(DESTDIR)/usr/lib/firewalld/services,/etc/firewalld/services)
BINDIR = $(DESTDIR)$(PREFIX)/bin
SBINDIR = $(DESTDIR)$(PREFIX)/sbin
GAMEDIR = $(DESTDIR)$(PREFIX)/games
DATADIR = $(DESTDIR)$(PREFIX)/share
SCRIPTDIR = $(DATADIR)/$(NAME)
SCRIPTGRPDIR = $(SCRIPTDIR)/cmdgrp
SCRIPTLIBDIR = $(SCRIPTDIR)/lib
SCRIPTPATCHDIR = $(SCRIPTDIR)/patch
LICENSEDIR = $(DATADIR)/licenses/$(NAME)
KF2MAINDIR = $(GAMEDIR)/$(NAME)
KF2BETADIR = $(GAMEDIR)/$(NAME)-beta
BASHCHECK := bash -n
SYSTEMDCHECK := systemd-analyze verify
XMLCHECK := xmllint --noout
.PHONY: build fake-systemd-build install uninstall filesystem test clean all
all: install
build:
mkdir $(RELEASEDIR)
cp -r $(SOURCEDIR)/main $(RELEASEDIR)
cp -r $(SOURCEDIR)/config $(RELEASEDIR)
find $(RELEASEDIR) -type f -exec sed -i 's|:DEFINE_PREFIX:|$(PREFIX)|g;' {} \;
fake-systemd-build:
find $(SOURCEDIR)/main -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 -r 's|ExecStart=.+KFGameSteamServer.bin.x86_64.*|ExecStart=/bin/bash|g;' {} \;
filesystem:
test -d '$(CONFDIR)' || install -m 775 -d '$(CONFDIR)'
test -d '$(INSTMAINDIR)' || install -m 775 -d '$(INSTMAINDIR)'
test -d '$(INSTBETADIR)' || install -m 775 -d '$(INSTBETADIR)'
test -d '$(MAPCYCLEDIR)' || install -m 775 -d '$(MAPCYCLEDIR)'
test -d '$(CACHEDIR)' || install -m 775 -d '$(CACHEDIR)'
test -d '$(BINDIR)' || install -m 755 -d '$(BINDIR)'
test -d '$(SBINDIR)' || install -m 755 -d '$(SBINDIR)'
test -d '$(KF2MAINDIR)' || install -m 775 -d '$(KF2MAINDIR)'
test -d '$(KF2BETADIR)' || install -m 775 -d '$(KF2BETADIR)'
test -d '$(LICENSEDIR)' || install -m 755 -d '$(LICENSEDIR)'
test -d '$(MAINLOGDIR)' || install -m 770 -d '$(MAINLOGDIR)'
test -d '$(BETALOGDIR)' || install -m 770 -d '$(BETALOGDIR)'
test -d '$(UNITDIR)' || install -m 755 -d '$(UNITDIR)'
test -d '$(FIREWALLDDIR)' || install -m 755 -d '$(FIREWALLDDIR)'
test -d '$(LOGROTATEDIR)' || install -m 755 -d '$(LOGROTATEDIR)'
test -d '$(RSYSLOGDIR)' || install -m 755 -d '$(RSYSLOGDIR)'
test -d '$(SCRIPTGRPDIR)' || install -m 755 -d '$(SCRIPTGRPDIR)'
test -d '$(SCRIPTLIBDIR)' || install -m 755 -d '$(SCRIPTLIBDIR)'
test -d '$(SCRIPTPATCHDIR)' || install -m 755 -d '$(SCRIPTPATCHDIR)'
test -d '$(BASHCOMPDIR)' || install -m 755 -d '$(BASHCOMPDIR)'
install: filesystem build
install -m 755 $(RELEASEDIR)/main/$(NAME) $(BINDIR)
install -m 755 $(RELEASEDIR)/main/$(NAME)-beta $(BINDIR)
# ugly, but works
find $(RELEASEDIR)/main/cmdgrp \
-mindepth 1 \
-maxdepth 1 \
-type d \
-printf "%f\n" | \
while read CmdGrp; \
do \
pushd $(RELEASEDIR)/main/cmdgrp/$$CmdGrp; \
install -m 755 -d $(SCRIPTGRPDIR)/$$CmdGrp; \
install -m 644 * $(SCRIPTGRPDIR)/$$CmdGrp; \
popd; \
done
install -m 644 $(RELEASEDIR)/main/lib/* $(SCRIPTLIBDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)@.service $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)-orig@.service $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)-beta@.service $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)-beta-orig@.service $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)-beta-update.service $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)-beta-update.timer $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)-update.service $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/systemd/$(NAME)-update.timer $(UNITDIR)
install -m 644 $(RELEASEDIR)/main/firewalld/$(NAME).xml $(FIREWALLDDIR)
install -m 644 $(RELEASEDIR)/main/logrotate/$(NAME) $(LOGROTATEDIR)
install -m 644 $(RELEASEDIR)/main/rsyslog/$(NAME).conf $(RSYSLOGDIR)
install -m 640 $(RELEASEDIR)/config/bot.conf $(CONFDIR)
install -m 644 $(RELEASEDIR)/config/instance.conf.template $(CONFDIR)
install -m 644 $(RELEASEDIR)/config/$(NAME).conf $(CONFDIR)
install -m 644 $(SOURCEDIR)/COPYING $(LICENSEDIR)
install -m 644 $(RELEASEDIR)/main/bash_completion/$(NAME) $(BASHCOMPDIR)
uninstall:
rm -f $(BINDIR)/$(NAME)
rm -f $(BINDIR)/$(NAME)-beta
rm -f $(UNITDIR)/$(NAME)@.service
rm -f $(UNITDIR)/$(NAME)-orig@.service
rm -f $(UNITDIR)/$(NAME)-beta@.service
rm -f $(UNITDIR)/$(NAME)-beta-orig@.service
rm -f $(UNITDIR)/$(NAME)-beta-update.service
rm -f $(UNITDIR)/$(NAME)-beta-update.timer
rm -f $(UNITDIR)/$(NAME)-update.service
rm -f $(UNITDIR)/$(NAME)-update.timer
rm -f $(FIREWALLDDIR)/$(NAME).xml
rm -f $(LOGROTATEDIR)/$(NAME)
rm -f $(RSYSLOGDIR)/$(NAME).conf
rm -rf $(LICENSEDIR)
rm -rf $(KF2MAINDIR)
rm -rf $(KF2BETADIR)
rm -rf $(CACHEDIR)
test: fake-systemd-build
$(XMLCHECK) $(RELEASEDIR)/main/firewalld/$(NAME).xml
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)@.service
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-orig@.service
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-beta@.service
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-beta-orig@.service
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-beta-update.service
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-beta-update.timer
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-update.service
$(SYSTEMDCHECK) $(RELEASEDIR)/main/systemd/$(NAME)-update.timer
$(BASHCHECK) $(RELEASEDIR)/main/$(NAME)
$(BASHCHECK) $(RELEASEDIR)/main/$(NAME)-beta
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/list
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/add
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/delete
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/ban/sync
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/game/update
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/game/validate
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/game/fix-permissions
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/game/run
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/list
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/add
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/delete
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/enable
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/disable
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/start
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/stop
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/restart
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/instance/chat
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/maprotate/save
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/maprotate/load
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/password/game
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/password/admin
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/list
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/add
$(BASHCHECK) $(RELEASEDIR)/main/cmdgrp/workshop/delete
$(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/game.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/instance.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/maprotate.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/password.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/playerids.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/webadmin.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/workshop.lib
$(BASHCHECK) $(RELEASEDIR)/main/lib/log.lib
$(BASHCHECK) $(RELEASEDIR)/main/bash_completion/$(NAME)
clean:
rm -rf $(RELEASEDIR)

67
SOURCES/README Normal file
View File

@ -0,0 +1,67 @@
kf2-srv
Command line tool for managing a set of Killing Floor 2 servers.
Usage: kf2-srv <group> <command> [<args>]
kf2-srv ban add <id>...
Add the specified user(s) to the blocklist
kf2-srv ban delete <id>...
remove the specified user(s) from the blocklist
kf2-srv ban list
Show the list of blocked users
kf2-srv ban sync
Sync blocklist for all servers
kf2-srv game fix-permissions [<instance>...]
Correct ini files permissions for the specified instance
kf2-srv game run [<args>...]
Start the server with the specified parameters
kf2-srv game update
Install or update the server
kf2-srv game validate
Check the integrity of files, update them if necessary
kf2-srv instance add <name>...
Create a new server instance(s) with the specified name(s)
kf2-srv instance chat <message> [<instance>...]
Send message to specified server instance(s)
kf2-srv instance delete [<instance>...]
Delete the specified server instance(s)
kf2-srv instance disable [<instance>...]
Disable autostart for specified server instance(s)
kf2-srv instance enable [<instance>...]
Enable autostart for specified server instance(s)
kf2-srv instance list [<instance>...]
Show status of the specified server instance(s)
kf2-srv instance restart [<instance>...]
Restart the specified server instance(s)
kf2-srv instance start [<instance>...]
Start the specified server instance(s)
kf2-srv instance stop [<instance>...]
Stop the specified server instance(s)
kf2-srv log cat [<instance>...]
Print in stdout full log of specified server instance(s)
kf2-srv log tail [<instance>...]
Print in stdout tail log of specified server instance(s) in real time
kf2-srv maprotate load [<instance>...]
Load map rotation for specified server instance(s)
kf2-srv maprotate save [<instance>...]
Save map rotation for specified server instance(s)
kf2-srv password admin <password> [<instance>...]
Set a admin password for the specified server instance(s)
kf2-srv password game <password> [<instance>...]
Set a game password for the specified server instance(s)
kf2-srv workshop add <workshop_id>...
Add specified resource(s) from steam workshop
kf2-srv workshop delete [<workshop_id>...]
Delete specified steam workshop resource(s)
kf2-srv workshop list
Show the list of steam workshop resources
kf2-srv workshop sync
Sync steam workshop resources between all server instances
Use --help as an argument for information on a specific group or command

4
SOURCES/config/bot.conf Normal file
View File

@ -0,0 +1,4 @@
# Bot default password
# To change the password for the bot, you must do this here and in WebAdmin.
# Otherwise, the bot will stop working and some actions cannot be done on running servers
ServerBotPassword=VerySecretBotPassword

View File

@ -0,0 +1,34 @@
# Displays game difficulty
# You can rename them as you like
DiffNames=('Normal' 'Hard' 'Suicide' 'Hell')
# Displays the number of waves
# You can rename them as you like (e.g. 'short' 'medium' 'long')
WaveNames=('4' '7' '10')
# Add custom gamemodes to the end of the list, similar to what is already there:
ModeNames['KFGameContent.KFGameInfo_Survival']='Survival'
ModeNames['KFGameContent.KFGameInfo_WeeklySurvival']='Weekly'
ModeNames['KFGameContent.KFGameInfo_Endless']='Endless'
ModeNames['KFGameContent.KFGameInfo_Objective']='Objective'
ModeNames['KFGameContent.KFGameInfo_VersusSurvival']='Versus'
# Custom gamemodes:
ModeNames['ControlledDifficulty_Endless.CD_Endless']='CD-E_Endless'
ModeNames['ControlledDifficulty_Eternal.CD_Survival']='CD-E_Survival'
ModeNames['ControlledDifficulty_Blackout.CD_Survival']='CD-B_Survival'
# Add mutators to the end of the list, similar to what is already there:
MutNames['ServerExtMut.ServerExtMut']='RPG'
MutNames['FriendlyHUD.FriendlyHUDMutator']='FriendlyHUD'
MutNames['KFMutator.KFMutator_MaxPlayersV2']='MaxPlayers'
MutNames['ClassicScoreboard.ClassicSCMut']='ClassicSC'
MutNames['ZedCustom.ZedCustomMut']='ZedVarients'
# These parameters are used when creating new instances and in the command "kf2-srv game fix-permissions"
IniPermissions=664
IniGroup=steam
# if true all steamclient.so will be replaced by symlinks to:
# /usr/games/steamcmd/linux64/steamclient.so
FixSteamclientLib=True

File diff suppressed because it is too large Load Diff

View File

@ -1,28 +0,0 @@
[Unit]
Description=Check and Update Killing Floor 2 server
[Service]
Type=oneshot
ExecStart=/usr/bin/kf2-srv-beta --chat 'Scheduled server restart at 4:00 (MSK)'
ExecStart=/usr/bin/kf2-srv-beta --chat 'Server will restart after 30 minutes'
ExecStart=/bin/sleep 15m
ExecStart=/usr/bin/kf2-srv-beta --chat 'Server will restart after 15 minutes'
ExecStart=/bin/sleep 10m
ExecStart=/usr/bin/kf2-srv-beta --chat 'Server will restart after 5 minutes'
ExecStart=/bin/sleep 5m
ExecStart=/usr/bin/kf2-srv-beta --chat 'Server shutting down...'
ExecStart=/bin/sleep 5s
ExecStart=/usr/bin/kf2-srv-beta --update
PrivateTmp=true
PrivateDevices=true
ProtectHome=false
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -1,22 +0,0 @@
[Unit]
Description=Killing Floor 2 Beta Server Daemon - %i
[Service]
User=steam
Group=steam
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=kf2-srv-beta/%i
EnvironmentFile=/etc/kf2-srv/instances-beta/%i/main.conf
ExecStart=/usr/games/kf2-srv-beta/Binaries/Win64/KFGameSteamServer.bin.x86_64 ${Map}?Difficulty=${Difficulty}?GameLength=${Length}?Game=${Game}?Mutator=${Mutators}?${Args} configsubdir=instances/%i -webadminport=${PortWeb} -queryport=${PortQuery} -port=${PortGame}
Restart=always
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -1,28 +0,0 @@
[Unit]
Description=Check and Update Killing Floor 2 server
[Service]
Type=oneshot
ExecStart=/usr/bin/kf2-srv --chat 'Scheduled server restart at 4:00 (MSK)'
ExecStart=/usr/bin/kf2-srv --chat 'Server will restart after 30 minutes'
ExecStart=/bin/sleep 15m
ExecStart=/usr/bin/kf2-srv --chat 'Server will restart after 15 minutes'
ExecStart=/bin/sleep 10m
ExecStart=/usr/bin/kf2-srv --chat 'Server will restart after 5 minutes'
ExecStart=/bin/sleep 5m
ExecStart=/usr/bin/kf2-srv --chat 'Server shutting down...'
ExecStart=/bin/sleep 5s
ExecStart=/usr/bin/kf2-srv --update
PrivateTmp=true
PrivateDevices=true
ProtectHome=false
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -1,22 +0,0 @@
# Displays game difficulty
# You can rename them as you like
DiffNames=('Normal' 'Hard' 'Suicide' 'Hell')
# Displays the number of waves
# You can rename them as you like
WaveNames=('4' '7' '10')
# Add custom gamemodes to the end of the list, similar to what is already there:
ModeNames['KFGameContent.KFGameInfo_Survival']='Survival'
ModeNames['KFGameContent.KFGameInfo_WeeklySurvival']='Weekly'
ModeNames['KFGameContent.KFGameInfo_Endless']='Endless'
ModeNames['KFGameContent.KFGameInfo_Objective']='Objective'
ModeNames['KFGameContent.KFGameInfo_VersusSurvival']='Versus'
# Add mutators to the end of the list, similar to what is already there:
MutNames['ServerExtMut.ServerExtMut']='RPG'
# Bot default password
# To change the password for the bot, you must do this here and in WebAdmin.
# Otherwise, the bot will stop working and some actions cannot be done on running servers
ServerBotPassword=VerySecretBotPassword

View File

@ -1,22 +0,0 @@
[Unit]
Description=Killing Floor 2 Server Daemon - %i
[Service]
User=steam
Group=steam
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=kf2-srv/%i
EnvironmentFile=/etc/kf2-srv/instances/%i/main.conf
ExecStart=/usr/games/kf2-srv/Binaries/Win64/KFGameSteamServer.bin.x86_64 ${Map}?Difficulty=${Difficulty}?GameLength=${Length}?Game=${Game}?Mutator=${Mutators}?${Args} configsubdir=instances/%i -webadminport=${PortWeb} -queryport=${PortQuery} -port=${PortGame}
Restart=always
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,108 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 _kf2_srv_completions ()
{
function groups_list ()
{
find "$GrpDir" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-printf "%f\n"
}
function commands_list () # $1: Command group
{
test -d "$GrpDir/$1" && \
find "$GrpDir/$1" \
-mindepth 1 \
-maxdepth 1 \
-type f \
-printf "%f\n"
}
function instances_list ()
{
find "$InsDir" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-printf "%f\n"
}
function command_usage_processing () # $1: Command group, $2: Command, $3: Current argument position
{
local CmdParams=$("$KF2Srv" "$1" "$2" "usage")
local LocalPosition; ((LocalPosition = $3 - 2))
local ParamIndex=0
local LastParam
for Param in $CmdParams
do
((ParamIndex++))
if [[ "$ParamIndex" -eq "$LocalPosition" ]]; then
if echo "$Param" | grep -Fq '<instance>'; then
COMPREPLY=($(compgen -W "$(instances_list)" -- "${CURARG}"))
fi
return 0
fi
LastParam="$Param"
done
if echo "$LastParam" | grep -Fq '<instance>...'; then
COMPREPLY=($(compgen -W "$(instances_list)" -- "${CURARG}"))
fi
}
COMPREPLY=()
CURARG="${COMP_WORDS[COMP_CWORD]}"
case "${COMP_CWORD}" in
1 ) COMPREPLY=($(compgen -W "$(groups_list)" -- "${CURARG}")) ;;
2 ) COMPREPLY=($(compgen -W "$(commands_list ${COMP_WORDS[1]})" -- "${CURARG}")) ;;
* ) command_usage_processing "${COMP_WORDS[1]}" "${COMP_WORDS[2]}" "${COMP_CWORD}";;
esac
return 0
}
function _kf2_srv_main_completions ()
{
local GrpDir=":DEFINE_PREFIX:/share/kf2-srv/cmdgrp"
local InsDir="/etc/kf2-srv/instances"
local KF2Srv=":DEFINE_PREFIX:/bin/kf2-srv"
_kf2_srv_completions
}
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

View File

@ -0,0 +1,48 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "<id>..."
}
function cmd_info ()
{
echo "Add the specified user(s) to the blocklist"
}
function cmd_help ()
{
echo "Id can be SteamID3, SteamID64 or a link to a user profile."
echo "EGS players are not supported."
}
function cmd_main () # $*: ban list
{
include "$LibDir/ban.lib"
ban_add "$@"
}

View File

@ -0,0 +1,48 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "<id>..."
}
function cmd_info ()
{
echo "Remove the specified user(s) from the blocklist"
}
function cmd_help ()
{
echo "Id can be SteamID3, SteamID64 or a link to a user profile."
echo "EGS players are not supported."
}
function cmd_main () # $*: ban list
{
include "$LibDir/ban.lib"
ban_delete "$@"
}

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-2021 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 () { false ;}
function cmd_usage ()
{
echo ""
}
function cmd_info ()
{
echo "Show the list of blocked users"
}
#function cmd_help ()
#{
# echo ""
#}
function cmd_main ()
{
include "$LibDir/ban.lib"
ban_list "$@"
}

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-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo ""
}
function cmd_info ()
{
echo "Sync blocklist for all servers"
}
#function cmd_help ()
#{
# echo ""
#}
function cmd_main ()
{
include "$LibDir/ban.lib"
ban_sync "$@"
}

View File

@ -0,0 +1,50 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Correct ini files permissions for the specified instance"
}
function cmd_help ()
{
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 ()
{
include "$LibDir/game.lib"
game_fix_permissions "$@"
}

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-2021 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 () { true ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo "[<args>...]"
}
function cmd_info ()
{
echo "Start the server with the specified parameters"
}
function cmd_help ()
{
echo "Run the server binary directly, without systemd or anything else."
}
function cmd_main ()
{
include "$LibDir/game.lib"
game_run "$@"
}

View File

@ -0,0 +1,48 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo ""
}
function cmd_info ()
{
echo "Install or update the server"
}
function cmd_help ()
{
echo "Stops all running server instances, installs updates (if any)"
echo "When finished, starts all enabled instances."
}
function cmd_main ()
{
include "$LibDir/game.lib"
game_update "$@"
}

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-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo ""
}
function cmd_info ()
{
echo "Check the integrity of files, update them if necessary"
}
function cmd_help ()
{
echo "Stops all running server instances, validate server files."
echo "When finished, starts all enabled instances."
}
function cmd_main ()
{
include "$LibDir/game.lib"
game_validate "$@"
}

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-2021 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 () { true ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo "<name>..."
}
function cmd_info ()
{
echo "Create a new server instance(s) with the specified name(s)"
}
function cmd_help ()
{
echo "Name(s) must not contain spaces."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_add "$@"
}

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-2021 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 () { true ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo "<message> [<instance>...]"
}
function cmd_info ()
{
echo "Send message to specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, sends a message to all running servers."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_chat "$@"
}

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-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Delete the specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, deletes all server instances."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_delete "$@"
}

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-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Disable autostart for specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, disable autostart for all instances."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_disable "$@"
}

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-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Enable autostart for specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, disable autostart for all instances."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_enable "$@"
}

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-2021 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 () { false ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Show status of the specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, displays the status of all instances."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_list "$@"
}

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-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Restart the specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, restarts all enabled instances."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_restart "$@"
}

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-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { true ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Start the specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, starts all enabled instances."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_start "$@"
}

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-2021 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 () { true ;}
cmd_need_steamuser () { false ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Stop the specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, stops all instances."
}
function cmd_main ()
{
include "$LibDir/instance.lib"
instance_stop "$@"
}

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-2021 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 full log of specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, prints the log of all instances."
}
function cmd_main ()
{
include "$LibDir/log.lib"
log_cat "$@"
}

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-2021 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

@ -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-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Load map rotation for specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, load map rotation for all instances."
}
function cmd_main () # $*: Instance[s]
{
include "$LibDir/maprotate.lib"
maprotate_load "$@"
}

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-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "[<instance>...]"
}
function cmd_info ()
{
echo "Save map rotation for specified server instance(s)"
}
function cmd_help ()
{
echo "If instance is not specified, save map rotation for all instances."
}
function cmd_main () # $*: Instance[s]
{
include "$LibDir/maprotate.lib"
maprotate_save "$@"
}

View File

@ -0,0 +1,49 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "<password> [<instance>...]"
}
function cmd_info ()
{
echo "Set a admin password for the specified server instance(s)"
}
function cmd_help ()
{
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 ()
{
include "$LibDir/password.lib"
password_admin "$@"
}

View File

@ -0,0 +1,49 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "<password> [<instance>...]"
}
function cmd_info ()
{
echo "Set a game password for the specified server instance(s)"
}
function cmd_help ()
{
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 ()
{
include "$LibDir/password.lib"
password_game "$@"
}

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-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "<workshop_id>..."
}
function cmd_info ()
{
echo "Add specified resource(s) from steam workshop"
}
function cmd_help ()
{
echo "workshop_id can be a resource ID or a link to a resource in workshop."
}
function cmd_main ()
{
include "$LibDir/workshop.lib"
workshop_add "$@"
}

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-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo "[<workshop_id>...]"
}
function cmd_info ()
{
echo "Delete specified steam workshop resource(s)"
}
function cmd_help ()
{
echo "workshop_id can be a resource ID or a link to a resource in workshop."
}
function cmd_main ()
{
include "$LibDir/workshop.lib"
workshop_delete "$@"
}

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-2021 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 () { false ;}
function cmd_usage ()
{
echo ""
}
function cmd_info ()
{
echo "Show the list of steam workshop resources"
}
#function cmd_help ()
#{
# echo ""
#}
function cmd_main ()
{
include "$LibDir/workshop.lib"
workshop_list "$@"
}

View File

@ -0,0 +1,48 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 () { true ;}
cmd_need_installed_server () { false ;}
function cmd_usage ()
{
echo ""
}
function cmd_info ()
{
echo "Sync steam workshop resources between all server instances"
}
function cmd_help ()
{
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 ()
{
include "$LibDir/workshop.lib"
workshop_sync "$@"
}

250
SOURCES/main/kf2-srv Executable file
View File

@ -0,0 +1,250 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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/>.
readonly ScriptFullname=$(readlink -e "$0")
readonly ScriptName=$(basename $0)
readonly ScriptVersion=$(rpm -q --queryformat '%{VERSION}' "$ScriptName")
readonly GrpDir=":DEFINE_PREFIX:/share/kf2-srv/cmdgrp"
readonly LibDir=":DEFINE_PREFIX:/share/kf2-srv/lib"
readonly PatchDir=":DEFINE_PREFIX:/share/kf2-srv/patch"
readonly InstallDir=":DEFINE_PREFIX:/games/kf2-srv${KF2POSTFIX}"
readonly AppBin="$InstallDir/Binaries/Win64/KFGameSteamServer.bin.x86_64"
readonly AppBinOrig="${AppBin}.orig"
readonly DefaultConfigDir="$InstallDir/KFGame/Config"
readonly DefaultDownloadDir="$InstallDir/Binaries/Win64/steamapps/workshop"
readonly DefaultCacheDir="$InstallDir/KFGame/Cache"
readonly DefaultLogDir="$InstallDir/KFGame/Logs"
readonly DownloadDir="/var/cache/kf2-srv/workshop"
readonly CacheDir="/var/cache/kf2-srv/cache"
readonly LogDir="/var/log/kf2-srv${KF2POSTFIX}"
readonly InstanceConfigDir="/etc/kf2-srv/instances${KF2POSTFIX}"
readonly InstanceConfigTemplate="/etc/kf2-srv/instance.conf.template"
readonly AppServerNum="232130"
readonly AppClientNum="232090"
readonly SteamConstB='17825793'
readonly ServerBotLogin="srvbot"
declare -a DiffNames
declare -a WaveNames
declare -A ModeNames
declare -A MutNames
function include () # $1: Lib
{
if ! echo "$INC_LIBS" | grep -Foq "$1"; then
source "$1"
export INC_LIBS="$INC_LIBS:$1"
fi
}
function run_as_steamuser () # $@: command
{
include "/etc/steamcmd/steamcmd.conf"
if [[ "$(whoami)" == "$SteamUser" ]]; then
shift 3; cmd_main "$@"
elif [[ -n $(groups "$(whoami)" | grep -Fo 'wheel') ]] || [[ "$(whoami)" == "root" ]]; then
export INC_LIBS=""
sudo -iu "$SteamUser" "$@"
else
echo "You must be a $SteamUser, root or sudo-user to run this command."
fi
}
function run_as_root () # $@: command
{
if [[ "$(whoami)" == "root" ]]; then
shift 3; cmd_main "$@"
elif [[ -n $(groups "$(whoami)" | grep -Fo 'wheel') ]]; then
export INC_LIBS=""
sudo -i "$@"
else
echo "You must be root or sudo-user to run this command."
fi
}
function is_help () # $1: Arg
{
echo "$1" | grep -Piqo '^(-h|--help|help)$'
}
function is_usage () # $1: Arg
{
echo "$1" | grep -Piqo '^usage$'
}
function is_version () # $1: Arg
{
echo "$1" | grep -Piqo '^(-v|--version|version)$'
}
function server_exists ()
{
test -x "$AppBin"
}
function function_exists () # $1: function name
{
type "$1" &> /dev/null
}
function indent () # $1: Level
{
local Tab=' '
for ((i=0; i<$1; i++))
do
echo -n "$Tab"
done
}
function groups_list ()
{
find "$GrpDir" \
-mindepth 1 \
-maxdepth 1 \
-type d \
-printf "%f\n" | \
sort
}
function commands_list () # $1: Command group
{
find "$GrpDir/$1" \
-mindepth 1 \
-maxdepth 1 \
-type f \
-printf "%f\n" | \
sort
}
function group_info () # $1: Command group
{
local Command
for Command in $(commands_list $1)
do
local CommandPathName="$GrpDir/$1/$Command"
( # subshell
source "$CommandPathName"
if function_exists "cmd_usage"; then
echo "$(indent 1)${ScriptName}${KF2POSTFIX} $1 $Command $(cmd_usage)"
else
echo "$(indent 1)${ScriptName}${KF2POSTFIX} $1 $Command"
fi
if function_exists "cmd_info"; then
cmd_info | sed -r "s|^|$(indent 2)|g"
else
echo "$(indent 2)No information"
fi
)
done
}
function full_info ()
{
echo "${ScriptName}${KF2POSTFIX} v${ScriptVersion}"
echo "Command line tool for managing a set of Killing Floor 2 servers."
echo ""
echo "Usage: ${ScriptName}${KF2POSTFIX} <group> <command> [<args>]"
echo ""
for Group in $(groups_list)
do
group_info "$Group"
echo ""
done
echo "Use --help as an argument for information on a specific group or command"
}
Group="$1"
Command="$2"
GroupPathname="$GrpDir/$Group"
CommandPathName="$GroupPathname/$Command"
if [[ $# -eq 0 ]] || is_help "$1"; then
full_info
exit 0
elif is_version "$1"; then
echo "${ScriptName}${KF2POSTFIX} v${ScriptVersion}"
exit 0
elif [[ -d "$GroupPathname" ]]; then
shift
if [[ $# -eq 0 ]] || is_help "$1"; then
group_info "$Group"
exit 0
elif [[ -r "$CommandPathName" ]]; then
shift
source "$CommandPathName"
if is_help "$1"; then
if ! function_exists "cmd_usage" \
&& ! function_exists "cmd_info" \
&& ! function_exists "cmd_help"; then
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
elif is_usage "$1"; then
if function_exists "cmd_usage"; then
cmd_usage
else
echo "No usage information for this command."
fi
else
if function_exists "cmd_main"; then
if function_exists "cmd_need_installed_server" && cmd_need_installed_server && ! server_exists; then
echo "You must install server first"
echo "Run \"${ScriptName}${KF2POSTFIX} game update\" to install it"
exit 1
elif function_exists "cmd_need_superuser" && cmd_need_superuser; then
run_as_root "${ScriptFullname}${KF2POSTFIX}" "$Group" "$Command" "$@"
elif function_exists "cmd_need_steamuser" && cmd_need_steamuser; then
run_as_steamuser "${ScriptFullname}${KF2POSTFIX}" "$Group" "$Command" "$@"
else
cmd_main "$@"
fi
else
echo "No implementation for the command $Command"
fi
fi
else
echo "Command not found: $Command"
exit 1
fi
else
echo "Command group not found: $Group"
exit 1
fi

View File

@ -1,7 +1,7 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019, 2020 GenZmeY
# Copyright (C) 2019-2021 GenZmeY
# mailto: genzmey@gmail.com
#
# This file is part of kf2-srv.
@ -19,4 +19,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
/usr/bin/kf2-srv beta $*
export KF2POSTFIX="-beta"
":DEFINE_PREFIX:/bin/kf2-srv" "$@"

167
SOURCES/main/lib/ban.lib Normal file
View File

@ -0,0 +1,167 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 ban_add () # $*: ban list
{
include "$LibDir/playerids.lib"
if [[ -z "$*" ]]; then
echo "Nothing to do"
exit 1
fi
for Ban in $*
do
ban_ID3 $(any_to_ID3 "$Ban")
done
}
function ban_delete () # $*: ban list
{
include "$LibDir/playerids.lib"
if [[ -z "$*" ]]; then
echo "Nothing to do"
exit 1
fi
for Ban in $*
do
unban_ID3 $(any_to_ID3 "$Ban")
done
}
function ban_sync ()
{
ban_list_id3 | \
while read ID3
do
ban_ID3 "$ID3"
done
}
function ban_list ()
{
include "$LibDir/playerids.lib"
{
local Num=1
echo "NUM STEAM_ID3 STEAM_ID64 URL_CONST URL_EFFECTIVE"
for ID3 in $(ban_list_id3)
do
local ID64=$(steamID3_to_steamID64 "$ID3")
local UrlConst="https://steamcommunity.com/profiles/$ID64"
local UrlEffective=$(curl "$UrlConst" -s -L -I -o /dev/null -w '%{url_effective}')
if [[ "$UrlConst" == "$UrlEffective" ]]; then
UrlEffective="-"
fi
echo "$Num $ID3 $ID64 $UrlConst $UrlEffective"
((Num++))
done
} | column -t
}
function ban_list_id3 ()
{
include "$LibDir/instance.lib"
local BanList=''
for Instance in $(show_instances)
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
if multini -gq "$Config" "Engine.AccessControl" "BannedIDs"; then
if [[ -n "$BanList" ]]; then
BanList+=$'\n'
fi
BanList+=$(multini -g "$Config" "Engine.AccessControl" "BannedIDs" | sed -r 's/.+A=([0-9]+),.+/\1/')
fi
done
echo "$BanList" | sort -V -u
}
function ban_ID3 () # $1: ID3
{
include "$LibDir/instance.lib"
include "$LibDir/webadmin.lib"
include "$LibDir/playerids.lib"
ID3="$1"
for Instance in $(show_instances)
do
(
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local BanStr="(Uid=(A=$ID3,B=$SteamConstB))"
local Service=$(service_name "$Instance")
if ! multini -gq "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr"; then
echo "Add ban $ID3 to $Instance"
if systemctl -q is-active $Service ; then
admin_curl "$Instance" "ServerAdmin/policy/bans" \
--request POST \
--data action="add" \
--data steamint64=$(steamID3_to_steamID64 $ID3) \
--data uniqueid=
else
multini -a "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr"
fi
fi
) &
done
wait
}
function unban_ID3 () # $1: ID3
{
include "$LibDir/instance.lib"
include "$LibDir/webadmin.lib"
ID3="$1"
for Instance in $(show_instances)
do
(
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local BanStr="(Uid=(A=$ID3,B=$SteamConstB))"
local Service=$(service_name "$Instance")
if systemctl -q is-active $Service ; then
local PlainID=0
while read Line
do
if echo "$Line" | grep -qF "A=$ID3,"; then
echo "Remove ban $ID3 from $Instance"
admin_curl "$Instance" "ServerAdmin/policy/bans" \
--request POST \
--data action="delete" \
--data banid="plainid:$PlainID"
break
else
((PlainID++))
fi
done < <(multini -g "$Config" 'Engine.AccessControl' 'BannedIDs')
else
if multini -gq "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr"; then
echo "Remove ban $ID3 from $Instance"
multini -d "$Config" "Engine.AccessControl" "BannedIDs" "$BanStr"
fi
fi
) &
done
wait
}

315
SOURCES/main/lib/game.lib Normal file
View File

@ -0,0 +1,315 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 game_fix_permissions () # $*: Instance[s]
{
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
fix_ini_permissions "$InstanceConfigDir"
else
for Instance in $InstanceList
do
fix_ini_permissions "$InstanceConfigDir/$Instance"
done
fi
}
function fix_ini_permissions () # $1: Dir
{
include /etc/steamcmd/steamcmd.conf
include /etc/kf2-srv/kf2-srv.conf
find "$1" \( -type l -o -type f \) -name '*.ini' | \
xargs --max-procs=$(nproc) -I {} \
sh -c "chmod $IniPermissions {}; chown $SteamUser:$IniGroup {}"
}
function game_run () # $@: Game args
{
"$AppBin" "$@"
}
function game_update ()
{
include /etc/steamcmd/steamcmd.conf
include "$LibDir/instance.lib"
if [[ -n "$KF2POSTFIX" ]]; then
local BetaArg="-beta preview"
fi
if ! server_exists; then
first_install
elif updates_aviable; then
instance_stop
steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg +exit
apply_patch
instance_start
else
echo "Server is up to date"
fi
}
function updates_aviable ()
{
return 0 # steamcmd does not show updates even if they are :(
# TODO: check updates correctly (but how?)
if [[ -n "$KF2POSTFIX" ]]; 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 game_validate ()
{
include /etc/steamcmd/steamcmd.conf
include "$LibDir/instance.lib"
if [[ -n "$KF2POSTFIX" ]]; then
local BetaArg="-beta preview"
fi
instance_stop
remove_symlink_steamclient_so
steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg validate +exit
apply_patch
create_symlink_steamclient_so
instance_start
}
function first_install ()
{
include /etc/steamcmd/steamcmd.conf
include /etc/kf2-srv/bot.conf
remove_symlink_steamclient_so
if ! steamcmd +login $SteamLogin +force_install_dir $InstallDir +app_update $AppServerNum $BetaArg validate +exit; then
echo "Errors during installation - exit"
exit 1
fi
rm -rf "$DefaultLogDir"
ln -s "$LogDir" "$DefaultLogDir"
echo "Creating base ini files"
sudo -u "$SteamUser" $AppBin &> /dev/null &
while true
do
if [[ -e "$DefaultConfigDir/KFAI.ini" ]] &&
[[ -e "$DefaultConfigDir/KFWeb.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer-KFEngine.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer-KFGame.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer-KFInput.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer-KFSystemSettings.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer/LinuxServerEngine.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer/LinuxServerGame.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer/LinuxServerInput.ini" ]] &&
[[ -e "$DefaultConfigDir/LinuxServer/LinuxServerSystemSettings.ini" ]]; then
break
fi
sleep 2
done
killall -KILL KFGameSteamServer.bin.x86_64; sleep 1
echo "Setting up WebAdmin"
multini -s "$DefaultConfigDir/KFWeb.ini" "IpDrv.WebServer" "bEnabled" "true"
multini -s "$DefaultConfigDir/LinuxServer-KFEngine.ini" "LogFiles" "PurgeLogsDays" "0"
multini -s "$DefaultConfigDir/LinuxServer-KFEngine.ini" "LogFiles" "LogTimes" "False"
sudo -u "$SteamUser" $AppBin &> /dev/null &
while true
do
if [[ -e "$DefaultConfigDir/KFWebAdmin.ini" ]]; then
break
fi
sleep 2
done
killall -KILL KFGameSteamServer.bin.x86_64; sleep 1
multini -s "$DefaultConfigDir/KFWebAdmin.ini" "WebAdmin.WebAdmin" "AuthenticationClass" "WebAdmin.MultiWebAdminAuth"
multini -s "$DefaultConfigDir/KFWebAdmin.ini" "WebAdmin.WebAdmin" "bHttpAuth" "True"
multini -s "$DefaultConfigDir/KFWebAdmin.ini" "WebAdmin.WebAdmin" "bChatLog" "True"
multini -s "$DefaultConfigDir/KFWebAdmin.ini" "WebAdmin.Chatlog" "Filename" "default-chat"
multini -s "$DefaultConfigDir/KFWebAdmin.ini" "WebAdmin.Chatlog" "bIncludeTimeStamp" "False"
echo "Wait while WebAdmin up"
sudo -u "$SteamUser" $AppBin &> /dev/null &
while ! curl -s -o "/dev/null" -u "Admin:Admin" "localhost:8080"
do
sleep 2
done
echo "Setting up server bot"
while ! curl -s -o "/dev/null" \
-u "Admin:Admin" \
"localhost:8080/ServerAdmin/multiadmin" \
--request POST \
--data adminid="$ServerBotLogin" \
--data action="create"
do sleep 2; done
while ! multini -gq \
"$DefaultConfigDir/KFMultiAdmin.ini" \
"$ServerBotLogin MultiAdminData" \
"Password"
do sleep 2; done
while ! curl -s -o "/dev/null" \
-u "Admin:Admin" \
"localhost:8080/ServerAdmin/multiadmin" \
--request POST \
--data adminid="$ServerBotLogin" \
--data displayname="ServerBot" \
--data enabled=1 \
--data password1="$ServerBotPassword" \
--data password2="$ServerBotPassword" \
--data order="DenyAllow" \
--data deny= \
--data allow= \
--data action="save"
do sleep 2; done
while [[ -z $(multini -g \
"$DefaultConfigDir/KFMultiAdmin.ini" \
"$ServerBotLogin MultiAdminData" \
"Password") ]]
do sleep 2; done
killall -KILL KFGameSteamServer.bin.x86_64; sleep 1
create_cache
create_symlink_steamclient_so
ln -s "$InstanceConfigDir" "$DefaultConfigDir/instances"
make_default_instance
apply_patch
echo "KF2 succesfully installed"
}
function create_cache ()
{
include /etc/steamcmd/steamcmd.conf
if [[ -d "$DownloadDir" ]]; then
if ! [[ -L "$DefaultDownloadDir" ]]; then
if [[ -d "$DefaultDownloadDir" ]]; then
rm -rf "$DefaultDownloadDir" "$DownloadDir"
ln -s "$DownloadDir" "$DefaultDownloadDir"
else
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$InstallDir/Binaries/Win64/steamapps"
ln -s "$DownloadDir" "$DefaultDownloadDir"
fi
fi
else
if [[ -L "$DefaultDownloadDir" ]]; then
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$DownloadDir"
elif [[ -d "$DefaultDownloadDir" ]]; then
mv -f "$DefaultDownloadDir" "$DownloadDir"
ln -s "$DownloadDir" "$DefaultDownloadDir"
else
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$DownloadDir"
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$InstallDir/Binaries/Win64/steamapps"
ln -s "$DownloadDir" "$DefaultDownloadDir"
fi
fi
if ! [[ -d "$CacheDir" ]]; then
install -d -g "$SteamUser" -o "$SteamUser" -m 775 "$CacheDir"
fi
if ! [[ -L "$DefaultCacheDir" ]]; then
ln -s "$CacheDir" "$DefaultCacheDir"
fi
}
function remove_symlink_steamclient_so ()
{
include /etc/kf2-srv/kf2-srv.conf
if echo "$FixSteamclientLib" | grep -qiF 'true'; then
rm -f "$InstallDir/linux64/steamclient.so"
rm -f "$InstallDir/steamclient.so"
rm -f "$InstallDir/Binaries/Win64/lib64/steamclient.so"
else
test -L "$InstallDir/linux64/steamclient.so" && rm -f "$InstallDir/linux64/steamclient.so"
test -L "$InstallDir/steamclient.so" && rm -f "$InstallDir/steamclient.so"
test -L "$InstallDir/Binaries/Win64/lib64/steamclient.so" && rm -f "$InstallDir/Binaries/Win64/lib64/steamclient.so"
fi
}
function create_symlink_steamclient_so ()
{
include /etc/kf2-srv/kf2-srv.conf
if echo "$FixSteamclientLib" | grep -qiF 'true'; then
ln -s "/usr/games/steamcmd/linux64/steamclient.so" "$InstallDir/linux64/steamclient.so"
ln -s "/usr/games/steamcmd/linux64/steamclient.so" "$InstallDir/steamclient.so"
ln -s "/usr/games/steamcmd/linux64/steamclient.so" "$InstallDir/Binaries/Win64/lib64/steamclient.so"
fi
}
function make_default_instance () # $1: Dir
{
include /etc/steamcmd/steamcmd.conf
include /etc/kf2-srv/kf2-srv.conf
local InstanceDir="$InstanceConfigDir/default"
install -d -g "$SteamUser" -o "$IniGroup" -m 775 "$InstanceDir"
install -d -g "$SteamUser" -o "$IniGroup" -m 775 "$InstanceDir/LinuxServer"
install -g "$SteamUser" -o "$IniGroup" -m $IniPermissions "$InstanceConfigTemplate" "$InstanceDir/instance.conf"
ln -s "$DefaultConfigDir/KFAI.ini" "$InstanceDir/KFAI.ini"
ln -s "$DefaultConfigDir/KFWeb.ini" "$InstanceDir/KFWeb.ini"
ln -s "$DefaultConfigDir/KFWebAdmin.ini" "$InstanceDir/KFWebAdmin.ini"
ln -s "$DefaultConfigDir/KFMultiAdmin.ini" "$InstanceDir/KFMultiAdmin.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-KFInput.ini" "$InstanceDir/LinuxServer-KFInput.ini"
ln -s "$DefaultConfigDir/LinuxServer-KFSystemSettings.ini" "$InstanceDir/LinuxServer-KFSystemSettings.ini"
ln -s "$DefaultConfigDir/LinuxServer/LinuxServerEngine.ini" "$InstanceDir/LinuxServer/LinuxServerEngine.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/LinuxServerSystemSettings.ini" "$InstanceDir/LinuxServer/LinuxServerSystemSettings.ini"
fix_ini_permissions "$InstanceDir"
fix_ini_eol "$InstanceDir"
}
function apply_patch ()
{
if [[ -x "$PatchDir/kf2-ranked-patch" ]]; then
"$PatchDir/kf2-ranked-patch" "$AppBin" "$AppBinOrig"
chmod +x "$AppBin" "$AppBinOrig"
chown "$SteamUser:$SteamUser" "$AppBin" "$AppBinOrig"
fi
}
function fix_ini_eol () # $1: Dir
{
find "$1" \( -type l -o -type f \) -name '*.ini' | \
xargs --max-procs=$(nproc) -I {} \
sh -c "dos2unix -F {}"
}

View File

@ -0,0 +1,432 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 show_enabled_instances ()
{
local EnabledInstances=""
for Instance in $(show_instances)
do
if systemctl -q is-enabled $(service_name "$Instance") ; then
EnabledInstances+=" $Instance"
fi
done
echo "$EnabledInstances"
}
function show_instances ()
{
find "$InstanceConfigDir" \
-maxdepth 1 \
-mindepth 1 \
-type d \
-printf "%f\n"
}
function service_name () # $*: Instance[s]
{
local Services=""
for Instance in $*
do
if multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "UseOrigApp" 2> /dev/null | grep -Piqo '^True$' && test -x "$AppBinOrig"; then
Services+=" kf2-srv${KF2POSTFIX}-orig@$Instance.service"
else
Services+=" kf2-srv${KF2POSTFIX}@$Instance.service"
fi
done
echo "$Services"
}
function service_names () # $*: Instance[s]
{
local Services=""
for Instance in $*
do
Services+=" kf2-srv${KF2POSTFIX}-orig@$Instance.service"
Services+=" kf2-srv${KF2POSTFIX}@$Instance.service"
done
echo "$Services"
}
function instance_exists () # $1: Instance
{
test -d "$InstanceConfigDir/$1"
return $?
}
function instance_add () # $*: InstanceName[s]
{
include /etc/steamcmd/steamcmd.conf
include /etc/kf2-srv/kf2-srv.conf
include "$LibDir/game.lib"
if [[ -z "$*" ]]; then
echo "Name of instance[s] must be set"
exit 1
fi
local MaxGamePort='7777'
local MaxQueryPort='27015'
local MaxWebAdminPort='8080'
for Instance in $(show_instances)
do
local Config="$InstanceConfigDir/$Instance/instance.conf"
local GamePort=$(multini --get "$Config" '' 'PortGame')
local WebAdminPort=$(multini --get "$Config" '' 'PortWeb')
local QueryPort=$(multini --get "$Config" '' 'PortQuery')
if [[ "$GamePort" -gt "$MaxGamePort" ]]; then MaxGamePort="$GamePort"; fi
if [[ "$QueryPort" -gt "$MaxQueryPort" ]]; then MaxQueryPort="$QueryPort"; fi
if [[ "$WebAdminPort" -gt "$MaxWebAdminPort" ]]; then MaxWebAdminPort="$WebAdminPort"; fi
done
for Instance in $*
do
if instance_exists "$Instance"; then
echo "Instance $Instance already exists - skip"
continue
fi
local InstanceDir="$InstanceConfigDir/$Instance"
local DirMode="-d -g $SteamUser -o $IniGroup -m 775"
local FileMode=" -g $SteamUser -o $IniGroup -m $IniPermissions"
install $DirMode "$InstanceDir"
install $DirMode "$InstanceDir/LinuxServer"
install $FileMode "$InstanceConfigTemplate" "$InstanceDir/instance.conf"
install $FileMode "$DefaultConfigDir/KFAI.ini" "$InstanceDir"
install $FileMode "$DefaultConfigDir/KFWeb.ini" "$InstanceDir"
install $FileMode "$DefaultConfigDir/KFWebAdmin.ini" "$InstanceDir"
install $FileMode "$DefaultConfigDir/KFMultiAdmin.ini" "$InstanceDir"
install $FileMode "$DefaultConfigDir/LinuxServer-KFEngine.ini" "$InstanceDir"
install $FileMode "$DefaultConfigDir/LinuxServer-KFGame.ini" "$InstanceDir"
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++))
multini -s "$InstanceDir/instance.conf" '' 'PortGame' "$MaxGamePort"
multini -s "$InstanceDir/instance.conf" '' 'PortQuery' "$MaxQueryPort"
multini -s "$InstanceDir/instance.conf" '' 'PortWeb' "$MaxWebAdminPort"
multini -s "$InstanceDir/KFWeb.ini" "IpDrv.WebServer" "bEnabled" "true"
multini -s "$InstanceDir/LinuxServer-KFEngine.ini" "LogFiles" "PurgeLogsDays" "0"
multini -s "$InstanceDir/LinuxServer-KFEngine.ini" "LogFiles" "LogTimes" "False"
multini -s "$InstanceDir/KFWebAdmin.ini" "WebAdmin.WebAdmin" "AuthenticationClass" "WebAdmin.MultiWebAdminAuth"
multini -s "$InstanceDir/KFWebAdmin.ini" "WebAdmin.WebAdmin" "bHttpAuth" "True"
multini -s "$InstanceDir/KFWebAdmin.ini" "WebAdmin.Chatlog" "Filename" "$Instance-chat"
multini -s "$InstanceDir/KFWebAdmin.ini" "WebAdmin.Chatlog" "bIncludeTimeStamp" "False"
echo "Instance $Instance created. See /etc/$ScriptName/instances$BetaPostfix/$Instance for edit configuration"
done
}
function instance_chat () # $1: Message, $*: instance...
{
include "$LibDir/webadmin.lib"
local Message=$(echo "$1" | sed 's/ /+/g')
shift
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
for Instance in $InstanceList
do
(
if instance_exists "$Instance"; then
local Service=$(service_name "$Instance")
if systemctl -q is-active $Service ; then
admin_curl "$Instance" "ServerAdmin/current/chat+frame+data" \
--request POST \
--data ajax=1 \
--data message="$Message" \
--data teamsay=-1
else
echo "Instance $Instance not running - skip"
fi
else
echo "Instance $Instance not exitst"
fi
) &
done
wait
}
function instance_delete () # $*: [InstanceName[s]]
{
if [[ -z "$*" ]]; then
echo "Are you sure you want to delete all instances? [y/N]"
local Answ="N"
read Answ
if [[ "$Answ" == "y" || "$Answ" == "Y" ]]; then
for Instance in $(show_instances)
do
(
instance_stop "$Instance"
instance_delete "$Instance"
) &
done
fi
else
for Instance in $*
do
(
if instance_exists "$Instance"; then
local InstanceDir="$InstanceConfigDir/$Instance"
instance_stop "$Instance"
rm -rf "$InstanceDir"
echo "Instance $Instance removed"
else
echo "Instance $Instance not exists"
fi
) &
done
fi
wait
}
function instance_disable () # $*: [InstanceName[s]]
{
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
local ToDisableInstanceList=""
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
ToDisableInstanceList+=" $Instance"
else
echo "Instance $Instance not exitst"
fi
done
if [[ -n "$ToDisableInstanceList" ]]; then
systemctl disable $(service_names "$ToDisableInstanceList")
else
echo "Nothing to do"
fi
}
function instance_enable () # $1*: [InstanceName[s]]
{
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
local ToEnableInstanceList=""
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
ToEnableInstanceList+=" $Instance"
else
echo "Instance $Instance not exist"
fi
done
if [[ -n "$ToEnableInstanceList" ]]; then
systemctl enable $(service_name "$ToEnableInstanceList")
else
echo "Nothing to do"
fi
}
function instance_list () # $*: [InstanceName[s]]
{
{
echo -e "INSTANCE:AUTORUN:STATE:P_GAME:P_QUERY:P_WEB:TYPE:LEN:DIFF:MUTATORS:ARGS:COMMENT"
{
local InstanceList="$*"
if [[ -z "$*" ]] ; then
InstanceList=$(show_instances)
fi
for Instance in $InstanceList
do
(
instance_status "$Instance"
) &
done
wait
} | sort -t : -k 4
} | column -t -s :
}
function instance_status () # $1: InstanceName
{
include /etc/kf2-srv/kf2-srv.conf
local Instance="$1"
if ! instance_exists "$Instance"; then return 1; fi
if systemctl -q is-enabled $(service_name "$Instance"); then
local IsEnabled="enabled"
else
local IsEnabled="disabled"
fi
if systemctl | grep $(service_name "$Instance") | grep -q 'running' ; then
local IsRuning="running"
else
local IsRuning="stopped"
fi
local Comment=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "Comment")
local GamePort=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "PortGame")
local WebAdminPort=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "PortWeb")
local QueryPort=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "PortQuery")
local GameType=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "Game")
local GameLength=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "Length")
local GameDifficulty=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "Difficulty")
local Map=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "Map")
local Mutators=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "Mutators")
local Args=$( multini -g "$InstanceConfigDir/$Instance/instance.conf" '' "Args")
local DisplayGameType=''
local DisplayGameLength=''
local DisplayDifficulty=''
local DisplayMutators=''
for Mutator in ${Mutators//,/ }
do
local MutName=${MutNames[$Mutator]}
if [[ -z "$MutName" ]]; then
MutName="$Mutator"
fi
if [[ -z "$DisplayMutators" ]]; then
DisplayMutators="$MutName"
else
DisplayMutators="$DisplayMutators, $MutName"
fi
done
if [[ -n "$GameType" ]]; then DisplayGameType=${ModeNames[$GameType]} ; fi
if [[ -n "$GameLength" ]]; then DisplayGameLength=${WaveNames[$GameLength]} ; fi
if [[ -n "$GameDifficulty" ]]; then DisplayDifficulty=${DiffNames[$GameDifficulty]} ; fi
if [[ -z "$DisplayMutators" ]] && [[ -z "$Mutators" ]]; then
DisplayMutators='-'
fi
if [[ -z "$DisplayGameType" ]]; then
DisplayGameType="$GameType"
fi
if [[ -z "$Args" ]]; then
Args='-'
fi
if [[ "$GameType" == 'KFGameContent.KFGameInfo_WeeklySurvival' || \
"$GameType" == 'KFGameContent.KFGameInfo_Endless' || \
"$GameType" == 'KFGameContent.KFGameInfo_VersusSurvival' || \
"$GameType" == 'KFGameContent.KFGameInfo_Objective' ]]; then
DisplayGameLength='-'
fi
if [[ "$GameType" == 'KFGameContent.KFGameInfo_WeeklySurvival' || \
"$DisplayGameType" == 'KFGameContent.KFGameInfo_VersusSurvival' ]]; then
DisplayDifficulty='-'
fi
echo -e "$Instance:$IsEnabled:$IsRuning:$GamePort:$QueryPort:$WebAdminPort:$DisplayGameType:$DisplayGameLength:$DisplayDifficulty:$DisplayMutators:$Args:$Comment"
}
function instance_restart () # $*: [InstanceName[s]]
{
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_enabled_instances)
fi
local ToRestartInstancesList=""
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
ToRestartInstancesList+=" $Instance"
else
echo "Instance $Instance not exitst"
fi
done
if [[ -n "$ToRestartInstancesList" ]]; then
systemctl restart $(service_name "$ToRestartInstancesList")
else
echo "Nothing to do"
fi
}
function instance_start () # $*: [InstanceName[s]]
{
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_enabled_instances)
fi
local InactiveServiceList=""
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
local Service=$(service_name "$Instance")
if systemctl -q is-active $Service ; then
echo "Instance $Instance already running - skip"
else
InactiveServiceList+=" $Service"
fi
else
echo "Instance $Instance not exitst"
fi
done
if [[ -n "$InactiveServiceList" ]]; then
systemctl start $InactiveServiceList
else
echo "Nothing to do"
fi
}
function instance_stop () # $*: [InstanceName[s]]
{
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
local ToStopInstanceList=""
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
ToStopInstanceList+=" $Instance"
else
echo "Instance $Instance not exitst"
fi
done
if [[ -n "$ToStopInstanceList" ]]; then
systemctl stop $(service_names "$ToStopInstanceList")
else
echo "Nothing to do"
fi
}

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-2021 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

@ -0,0 +1,109 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 maprotate_load () # $*: Instance[s]
{
include "$LibDir/instance.lib"
include "$LibDir/webadmin.lib"
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
for Instance in $InstanceList
do
(
local Service=$(service_name "$Instance")
local MapRotate="$InstanceConfigDir/$Instance/MapRotate.ini"
if ! instance_exists "$Instance"; then
echo "Instance $Instance not exists"
elif ! [[ -e "$MapRotate" ]]; then
echo "$MapRotate not found - skip"
elif systemctl -q is-active $Service ; then
# TODO: Delete other cycles
# Example: maplistidx=1&mapcycle=KF-Airship%0D%0A&delete=doit
local ActiveCycleIndex=$(multini -g "$MapRotate" '' 'ActiveMapCycle')
local ActiveCycleWeb=''
local Index=0
while read MapCycle
do
local MapCycleWeb=$(map_rotate_to_webstring "$MapCycle")
admin_curl "$Instance" "ServerAdmin/settings/maplist" \
--request POST \
--data maplistidx="$Index" \
--data mapcycle="$MapCycleWeb" \
--data action="save"
if [[ "$Index" -eq "$ActiveCycleIndex" ]]; then
ActiveCycleWeb="$MapCycleWeb"
fi
((Index++))
done < <(multini -g "$MapRotate" '' 'GameMapCycles')
if [[ -n "$ActiveCycleWeb" ]]; then
admin_curl "$Instance" "ServerAdmin/settings/maplist" \
--request POST \
--data maplistidx="$ActiveCycleIndex" \
--data mapcycle="$ActiveCycleWeb" \
--data activate="activate"
fi
else
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
sed -i --follow-symlinks -r "/(ActiveMapCycle=|GameMapCycles=)/d" "$Config"
sed -i --follow-symlinks "/\[KFGame\.KFGameInfo\]/ r $MapRotate" "$Config"
fi
) &
done
wait
}
function maprotate_save () # $*: Instance[s]
{
include "$LibDir/instance.lib"
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
for Instance in $InstanceList
do
if instance_exists "$Instance"; then
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local MapRotate="$InstanceConfigDir/$Instance/MapRotate.ini"
grep -F 'ActiveMapCycle=' "$Config" > "$MapRotate"
grep -F 'GameMapCycles=' "$Config" >> "$MapRotate"
else
echo "Instance $Instance not exitst"
fi
done
}
function map_rotate_to_webstring () # $1: MapRotate
{
local RN='%0D%0A'
echo "$1" | \
sed -r 's/^\(Maps=\("//' | \
sed -r 's/"\)\)$//' | \
sed 's/ /+/g' | \
sed "s/\",\"/${RN}/g"
}

View File

@ -0,0 +1,99 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 password_game () # $1: Password (if empty, use: ''), $*: Instance[s]
{
include "$LibDir/instance.lib"
include "$LibDir/webadmin.lib"
if echo "$1" | grep -qP '\s'; then
echo "Password should not contain spaces"
return 1
fi
local Password="$1"; shift
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
for Instance in $InstanceList
do
(
if instance_exists "$Instance"; then
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local Service=$(service_name "$Instance")
if systemctl -q is-active $Service ; then
admin_curl "$Instance" "ServerAdmin/policy/passwords" \
--request POST \
--data action="gamepassword" \
--data gamepw1="$Password" \
--data gamepw2="$Password"
else
multini -s "$Config" "Engine.AccessControl" "GamePassword" "$Password"
fi
else
echo "Instance $Instance not exitst"
fi
) &
done
wait
}
function password_admin () # $1: Password (if empty, use: ''), $*: Instance[s]
{
include "$LibDir/instance.lib"
include "$LibDir/webadmin.lib"
if echo "$1" | grep -qP '\s'; then
echo "Password should not contain spaces"
return 1
fi
local Password="$1"; shift
local InstanceList="$*"
if [[ -z "$InstanceList" ]] ; then
InstanceList=$(show_instances)
fi
for Instance in $InstanceList
do
(
if instance_exists "$Instance"; then
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
local Service=$(service_name "$Instance")
if systemctl -q is-active $Service ; then
admin_curl "$Instance" "ServerAdmin/policy/passwords" \
--request POST \
--data action="adminpassword" \
--data adminpw1="$Password" \
--data adminpw2="$Password"
else
multini -s "$Config" "Engine.AccessControl" "AdminPassword" "$Password"
fi
else
echo "Instance $Instance not exitst"
fi
) &
done
wait
}

View File

@ -0,0 +1,64 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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/>.
# WARNING:
# Conversion works correctly for positive A/B for EGS,
# but still gives incorrect results if there are negative ones
function steamID3_to_steamID64 () # $1: ID3 (A), $2: B
{
local ID3="$1"
if [[ -z $2 ]]; then
local B="$SteamConstB"
else
local B="$2"
fi
# SteamID64=B*2^32+SteamID3
echo $(($B*(2**32)+$ID3))
}
function steamID64_to_steamID3 () # $1: ID64, $2: B
{
local ID64="$1"
if [[ -z $2 ]]; then
local B="$SteamConstB"
else
local B="$2"
fi
# SteamID3=SteamID64-B*2^32
echo $(($ID64-$B*(2**32)))
}
function any_to_ID3 () # $1: ID3/ID64/Url
{
if echo "$1" | grep -qP '^http.+'; then
local ID64=$(curl -ss "$1/?xml=1" | xmllint --xpath 'string(//steamID64/text())' -)
local ID3=$(steamID64_to_steamID3 "$ID64")
elif [[ $(echo "$1" | wc -m) -eq 18 ]] && echo "$1" | grep -qP '^7656[0-9]+' ; then
local ID3=$(steamID64_to_steamID3 "$1")
else
local ID3="$1"
fi
echo "$ID3"
}

View File

@ -0,0 +1,33 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 admin_curl () # $1: Instance, $2: URL, $*: Request
{
include /etc/kf2-srv/bot.conf
local Instance="$1"
local URL="$2"
local InstanceConf="$InstanceConfigDir/$Instance/instance.conf"
local WebPort=$(multini --get "$InstanceConf" '' "PortWeb")
shift; shift
curl -s -o "/dev/null" -u "$ServerBotLogin:$ServerBotPassword" "localhost:$WebPort/$URL" $*
}

View File

@ -0,0 +1,185 @@
#!/bin/bash
# kf2-srv is a command line tool for managing a set of Killing Floor 2 servers.
# Copyright (C) 2019-2021 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 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_ids ()
{
include "$LibDir/instance.lib"
local WsList=''
for Instance in $(show_instances)
do
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
if multini -gq "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems"; then
if [[ -n "$WsList" ]]; then
WsList+=$'\n'
fi
WsList+=$(multini -g "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems")
fi
done
echo "$WsList" | sort -V -u
}
function workshop_list ()
{
# TODO: Multiple *.kfm/*u in folder
{
echo "WORKSHOP_ID NAME SIZE WORKSHOP_URL"
{
for WorkshopID in $(workshop_list_ids)
do
(
local Cache="$CacheDir/$WorkshopID"
local Downl="$DownloadDir/content/$AppClientNum/$WorkshopID"
local Url="https://steamcommunity.com/sharedfiles/filedetails/?id=$WorkshopID"
local WsName=$(name_by_workshopID "$WorkshopID")
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
wait
} | sort -k 2
} | column -t
}
function any_to_workshopID () # $1: WorkshopID/URL
{
if echo "$1" | grep -qP '^http.+'; then
local WorkshopID=$(echo "$1" | sed -r 's/.+=([0-9]+)$/\1/')
else
local WorkshopID="$1"
fi
echo "$WorkshopID"
}
function workshop_add () # $*: WorkshopID[s]
{
include "$LibDir/instance.lib"
for Instance in $(show_instances)
do
(
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
multini -ar "$Config" "IpDrv.TcpNetDriver" "DownloadManagers" "OnlineSubsystemSteamworks.SteamWorkshopDownload"
for Map in $*
do
local WorkshopID=$(any_to_workshopID "$Map")
if ! multini -gq "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems" "$WorkshopID"; then
echo "Add workshop $WorkshopID to $Instance"
multini -ar "$Config" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems" "$WorkshopID"
fi
done
) &
done
wait
}
function workshop_delete () # $*: WorkshopID[s]
{
include "$LibDir/instance.lib"
for Map in $*
do
local WorkshopID=$(any_to_workshopID "$Map")
local WsName=$(name_by_workshopID "$WorkshopID")
local Cache="$CacheDir/$WorkshopID"
local Downl="$DownloadDir/content/$AppClientNum/$WorkshopID"
echo -e "Clear cache:\n$Cache\n$Downl"
rm -rf "$Cache" "$Downl"
for Instance in $(show_instances)
do
(
local ConfigEngine="$InstanceConfigDir/$Instance/LinuxServer-KFEngine.ini"
multini -d "$ConfigEngine" "OnlineSubsystemSteamworks.KFWorkshopSteamworks" "ServerSubscribedWorkshopItems" "$WorkshopID"
if echo "$WsName" | grep -qP '\.kfm$' ; then
echo "Remove map $WorkshopID ($WsName) from $Instance"
local WsNameShort=$(echo "$WsName" | sed 's/\.kfm$//')
local ConfigGame="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
multini -d "$ConfigGame" "$WsNameShort KFMapSummary"
fi
) &
done
wait
done
}
function workshop_sync ()
{
include "$LibDir/instance.lib"
workshop_add $(workshop_list_ids)
# TODO: Make it faster
for Instance in $(show_instances)
do
(
local Service=$(service_name "$Instance")
if ! instance_exists "$Instance"; then
echo "Instance $Instance not exitst"
elif systemctl -q is-active $Service ; then
echo "Instance $Instance is running - skip."
else
local Config="$InstanceConfigDir/$Instance/LinuxServer-KFGame.ini"
for MapFile in $(find -L "$CacheDir" -type f -name '*.kfm' -printf "%f\n")
do
MapName=$(echo "$MapFile" | sed -r 's|.kfm$||')
if ! multini -gq "$Config" "$MapName KFMapSummary"; then
echo "Adding $MapName to $Instance."
multini -s "$Config" "$MapName KFMapSummary" "MapName" "$MapName"
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInSurvival" "True"
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInWeekly" "True"
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInVsSurvival" "True"
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInEndless" "True"
multini -s "$Config" "$MapName KFMapSummary" "bPlayableInObjective" "False"
fi
done
for MutFile in $(find -L "$CacheDir" -type f -name '*.u' -printf "%f\n")
do
MutName=$(echo "$MutFile" | sed -r 's|.u$||')
if ! multini -gq "$Config" "$MutName KFMutatorSummary"; then
echo "Adding $MutName to $Instance."
multini -s "$Config" "$MutName KFMutatorSummary" "ClassName" ""
fi
done
fi
) &
done
wait
}

View File

@ -1,6 +1,7 @@
/var/log/kf2-srv/*.log
/var/log/kf2-srv-beta/*.log
{
su root steam
daily
missingok
rotate 7

View File

@ -0,0 +1,13 @@
global(parser.permitSlashInProgramName="on")
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
{
action(Type="omfile" DynaFile="DynFile" FileCreateMode="0644" Umask="0022" FileOwner="root" FileGroup="steam")
stop
}

View File

@ -0,0 +1,25 @@
[Unit]
Description=Killing Floor 2 Beta Server Daemon - %i
Conflicts=kf2-srv-beta@%i.service
After=network-online.target
Wants=network-online.target
[Service]
User=steam
Group=steam
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=kf2-srv-beta/%i
EnvironmentFile=/etc/kf2-srv/instances-beta/%i/instance.conf
ExecStart=:DEFINE_PREFIX:/games/kf2-srv-beta/Binaries/Win64/KFGameSteamServer.bin.x86_64.orig ${Map}?Difficulty=${Difficulty}?GameLength=${Length}?Game=${Game}?Mutator=${Mutators}?${Args} configsubdir=instances/%i -webadminport=${PortWeb} -queryport=${PortQuery} -port=${PortGame}
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,30 @@
[Unit]
Description=Check and Update Killing Floor 2 server
After=network-online.target
Requires=network-online.target
[Service]
Type=oneshot
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv-beta instance chat '.'
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv-beta instance chat 'Server will restart after 30 minutes'
ExecStart=/bin/sleep 15m
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv-beta instance chat 'Server will restart after 15 minutes'
ExecStart=/bin/sleep 10m
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv-beta instance chat 'Server will restart after 5 minutes'
ExecStart=/bin/sleep 5m
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv-beta instance chat 'Server shutting down...'
ExecStart=/bin/sleep 5s
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv-beta game update
PrivateTmp=true
PrivateDevices=true
ProtectHome=false
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,25 @@
[Unit]
Description=Killing Floor 2 Beta Server Daemon - %i
Conflicts=kf2-srv-beta-orig@%i.service
After=network-online.target
Wants=network-online.target
[Service]
User=steam
Group=steam
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=kf2-srv-beta/%i
EnvironmentFile=/etc/kf2-srv/instances-beta/%i/instance.conf
ExecStart=:DEFINE_PREFIX:/games/kf2-srv-beta/Binaries/Win64/KFGameSteamServer.bin.x86_64 ${Map}?Difficulty=${Difficulty}?GameLength=${Length}?Game=${Game}?Mutator=${Mutators}?${Args} configsubdir=instances/%i -webadminport=${PortWeb} -queryport=${PortQuery} -port=${PortGame}
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,25 @@
[Unit]
Description=Killing Floor 2 Server Daemon - %i
Conflicts=kf2-srv@%i.service
After=network-online.target
Wants=network-online.target
[Service]
User=steam
Group=steam
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=kf2-srv/%i
EnvironmentFile=/etc/kf2-srv/instances/%i/instance.conf
ExecStart=:DEFINE_PREFIX:/games/kf2-srv/Binaries/Win64/KFGameSteamServer.bin.x86_64.orig ${Map}?Difficulty=${Difficulty}?GameLength=${Length}?Game=${Game}?Mutator=${Mutators}?${Args} configsubdir=instances/%i -webadminport=${PortWeb} -queryport=${PortQuery} -port=${PortGame}
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,30 @@
[Unit]
Description=Check and Update Killing Floor 2 server
After=network-online.target
Requires=network-online.target
[Service]
Type=oneshot
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance chat '.'
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance chat 'Server will restart after 30 minutes'
ExecStart=/bin/sleep 15m
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance chat 'Server will restart after 15 minutes'
ExecStart=/bin/sleep 10m
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance chat 'Server will restart after 5 minutes'
ExecStart=/bin/sleep 5m
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv instance chat 'Server shutting down...'
ExecStart=/bin/sleep 5s
ExecStart=:DEFINE_PREFIX:/bin/kf2-srv game update
PrivateTmp=true
PrivateDevices=true
ProtectHome=false
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,25 @@
[Unit]
Description=Killing Floor 2 Server Daemon - %i
Conflicts=kf2-srv-orig@%i.service
After=network-online.target
Wants=network-online.target
[Service]
User=steam
Group=steam
Type=simple
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=kf2-srv/%i
EnvironmentFile=/etc/kf2-srv/instances/%i/instance.conf
ExecStart=:DEFINE_PREFIX:/games/kf2-srv/Binaries/Win64/KFGameSteamServer.bin.x86_64 ${Map}?Difficulty=${Difficulty}?GameLength=${Length}?Game=${Game}?Mutator=${Mutators}?${Args} configsubdir=instances/%i -webadminport=${PortWeb} -queryport=${PortQuery} -port=${PortGame}
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=true
PrivateDevices=true
ProtectHome=true
ProtectSystem=false
[Install]
WantedBy=multi-user.target

View File

@ -1,8 +0,0 @@
global(parser.permitSlashInProgramName="on")
$template NAMED_LOG,"/var/log/%programname%.log"
$FileCreateMode 0644
$Umask 0022
if $programname startswith 'kf2-srv' then ?NAMED_LOG
& stop

View File

@ -1,30 +1,22 @@
%global steamuser steam
Name: kf2-srv
Version: 0.11.1
Version: 0.18.1
Release: 1%{dist}
Summary: Killing Floor 2 server
Group: Amusements/Games
License: GNU GPLv3
BuildArch: noarch
Source1: %{name}
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
Source11: %{name}.conf
Source12: COPYING
Source13: rsyslog-%{name}.conf
Source14: logrotate-%{name}
Source0: %{name}-%{version}.tar.gz
# test deps
BuildRequires: systemd
BuildRequires: systemd-rpm-macros
BuildRequires: libxml2
Requires: systemd >= 219
Requires: steamcmd
Requires: steamcmd >= 2018.01.05-5
Requires: libxml2
Requires: dos2unix
Requires: curl
@ -38,6 +30,8 @@ Requires: gawk
Requires: multini >= 0.2.3
Requires: rsyslog >= 8.25.0
Requires: logrotate
Requires: inotify-tools
Requires: bash-completion >= 2.7
Provides: %{name}
@ -45,79 +39,132 @@ Provides: %{name}
Command line tool for managing a set of Killing Floor 2 servers.
%prep
%setup -q -c
%build
%install
rm -rf $RPM_BUILD_ROOT
install -d %{buildroot}/%{_bindir}
install -d %{buildroot}/%{_prefix}/lib/systemd/system
install -d %{buildroot}/%{_prefix}/lib/firewalld/services
install -d %{buildroot}/%{_sysconfdir}/%{name}/instances
install -d %{buildroot}/%{_sysconfdir}/%{name}/instances-beta
install -d %{buildroot}/%{_sysconfdir}/%{name}/mapcycles
install -d %{buildroot}/%{_sysconfdir}/rsyslog.d
install -d %{buildroot}/%{_sysconfdir}/logrotate.d
install -d %{buildroot}/%{_prefix}/games/%{name}
install -d %{buildroot}/%{_prefix}/games/%{name}-beta
install -d %{buildroot}/%{_datadir}/licenses/%{name}
install -d %{buildroot}/%{_localstatedir}/log/%{name}
install -d %{buildroot}/%{_localstatedir}/log/%{name}-beta
make install DESTDIR=%{buildroot} PREFIX=%{_prefix}
# access rights are used here to prevent warnings when building the package
install -m 755 %{SOURCE1} %{buildroot}/%{_bindir}
install -m 755 %{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
install -m 644 %{SOURCE11} %{buildroot}/%{_sysconfdir}/%{name}
install -m 644 %{SOURCE12} %{buildroot}/%{_datadir}/licenses/%{name}
install -m 644 %{SOURCE13} %{buildroot}/%{_sysconfdir}/rsyslog.d/%{name}.conf
install -m 644 %{SOURCE14} %{buildroot}/%{_sysconfdir}/logrotate.d/%{name}
%check
make test DESTDIR=%{buildroot} PREFIX=%{_prefix}
%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(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/instances-beta
%attr(775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/mapcycles
%attr(775,root,%{steamuser}) %dir %{_localstatedir}/log/%{name}
%attr(775,root,%{steamuser}) %dir %{_localstatedir}/log/%{name}-beta
%attr(644,root,%{steamuser}) %config(noreplace) %{_sysconfdir}/%{name}/main.conf.template
%attr(644,root,%{steamuser}) %config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%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/*
%attr(644,root,root) %doc %{_datadir}/licenses/%{name}/*
%attr(644,root,root) %{_sysconfdir}/rsyslog.d/%{name}.conf
%attr(644,root,root) %{_sysconfdir}/logrotate.d/%{name}
%attr(0775,root,%{steamuser}) %dir %{_prefix}/games/%{name}
%attr(0775,root,%{steamuser}) %dir %{_prefix}/games/%{name}-beta
%attr(0775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}
%attr(0775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/instances
%attr(0775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/instances-beta
%attr(0775,root,%{steamuser}) %dir %{_sysconfdir}/%{name}/mapcycles
%attr(0775,root,%{steamuser}) %dir %{_localstatedir}/log/%{name}
%attr(0775,root,%{steamuser}) %dir %{_localstatedir}/log/%{name}-beta
%attr(0775,root,%{steamuser}) %dir %{_localstatedir}/cache/kf2-srv
%attr(0775,root,root) %dir %{_datadir}/%{name}
%attr(0775,root,root) %dir %{_datadir}/%{name}/cmdgrp
%attr(0755,root,root) %dir %{_datadir}/%{name}/cmdgrp/*
%attr(0775,root,root) %dir %{_datadir}/%{name}/lib
%attr(0775,root,root) %dir %{_datadir}/%{name}/patch
%attr(0664,root,%{steamuser}) %config(noreplace) %{_sysconfdir}/%{name}/instance.conf.template
%attr(0664,root,%{steamuser}) %config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%attr(0640,root,%{steamuser}) %config(noreplace) %{_sysconfdir}/%{name}/bot.conf
%attr(0644,root,root) %config(noreplace) %{_prefix}/lib/firewalld/services/%{name}.xml
%attr(0755,root,root) %{_bindir}/%{name}
%attr(0755,root,root) %{_bindir}/%{name}-beta
%attr(0644,root,root) %{_unitdir}/*
%attr(0644,root,root) %doc %{_datadir}/licenses/%{name}/*
%attr(0644,root,root) %{_sysconfdir}/rsyslog.d/%{name}.conf
%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}
%attr(0644,root,root) %{_datadir}/%{name}/cmdgrp/*/*
%attr(0644,root,root) %{_datadir}/%{name}/lib/*
%attr(0644,root,root) %{_sysconfdir}/bash_completion.d/%{name}
%preun
if [[ $1 -eq 0 ]] ; then # Uninstall
%{_bindir}/%{name} --stop
%{_bindir}/%{name} --disable
%{_bindir}/%{name} instance stop
%{_bindir}/%{name} instance 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
rm -rf %{_localstatedir}/cache/kf2-srv/*
fi
%post
if [[ $1 == 1 ]]; then # Install
systemctl daemon-reload
systemctl restart rsyslog.service
systemctl try-restart rsyslog.service
fi
%changelog
* Tue Jun 22 2021 GenZmeY <genzmey@gmail.com> - 0.18.1-1
- fix "FixSteamclientLib" setting.
* Tue Jun 22 2021 GenZmeY <genzmey@gmail.com> - 0.18.0-1
- add FixSteamclientLib setting to config.
* Sat Feb 27 2021 GenZmeY <genzmey@gmail.com> - 0.17.1-1
- fix the start of the original app.
* Sun Feb 21 2021 GenZmeY <genzmey@gmail.com> - 0.17.0-1
- binary patching support.
* 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
- bash completion support.
* Mon Aug 10 2020 GenZmeY <genzmey@gmail.com> - 0.14.1-2
- github-actions build.
* Sat Aug 8 2020 GenZmeY <genzmey@gmail.com> - 0.14.1-1
- parallel actions for instance list.
* Sat Aug 8 2020 GenZmeY <genzmey@gmail.com> - 0.14.0-1
- new usage (groups/commands);
- new code structure;
- build system;
- tests;
- parallel actions;
- short english description.
* Sun Jul 19 2020 GenZmeY <genzmey@gmail.com> - 0.13.0-1
- /var/cache to store the workshop cache;
- fixed endless downloading of workshop items that tripware gave us in PC Build 1099 patch;
- using ForcePermissions when creating instances;
- add %check section to specfile.
* Mon Jul 13 2020 GenZmeY <genzmey@gmail.com> - 0.12.1-1
- rename main.conf to instance.conf.
* Mon Jul 13 2020 GenZmeY <genzmey@gmail.com> - 0.12.0-1
- chat logs without timestamp;
- update rsyslog config - now logs will be create with steam group and 640 permissions;
- update logrotate config (fixed that logrotate does nothing);
- bot password in separate file without read permission to others;
- feat: force attr for log/ini files.
* Thu Jul 9 2020 GenZmeY <genzmey@gmail.com> - 0.11.1-1
- fix syntax error in firewalld service.

60
TODO
View File

@ -1,60 +0,0 @@
- selinux
- sudo for steamuser
- kick by level
- split the script into separate files
- man pages
- english help
- ban history
- temporary ban
- understand what causes a "cpu hurricane" at startup
- generate unique password for server bot on install
- parallel actions
- bash completion
###################
Split scheme:
game
update
validate
fix-permissions
run
help
instance
list
new
delete
enable
disable
start
stop
restart
chat
help
ban
list
add
delete
sync
help
workshop
list
add
delete
sync
help
password
game
admin
help
maprotate
save
load
help
help h -h --help

4
TODO.md Normal file
View File

@ -0,0 +1,4 @@
# TODO:
- [ ] split source and rpmbuild
- [ ] add shellcheck
- [ ] webadmin patch

View File

@ -1,13 +0,0 @@
#!/bin/bash
ScriptFullname=$(readlink -e "$0")
SrpmProjectDir=$(dirname "$ScriptFullname")
RpmBuild="$HOME/rpmbuild"
if [[ -d "$RpmBuild" ]]; then
rm -rf "$RpmBuild"
else
rm -f "$RpmBuild"
fi
ln -s "$SrpmProjectDir" "$RpmBuild"