Добавление начального функционала для systemd

This commit is contained in:
Евгений Храмов 2023-05-06 16:46:07 +03:00
parent 822b20dd87
commit 041532f2ce

129
hlna.py

@ -1,21 +1,22 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os import os
import time
import threading
from pathlib import Path import threading
from pprint import pprint
import yaml import yaml
import click import click
import colorama import colorama
import click_completion
from pathlib import Path
from rcon.source import Client from rcon.source import Client
home_dir = Path.home() home_dir = Path.home()
dir_server = f"{home_dir}/ARK_Servers/" dir_server = f"{home_dir}/ARK_Servers/"
dir_config = f"{home_dir}/.config/hlna/maps/" server_dir = dir_server + "ShooterGame/Binaries/Linux/"
dir_unit = f"{home_dir}/.config/systemd/user/"
dir_config = f"{home_dir}/.config/hlna/"
dir_maps = f"{dir_config}maps/"
mods_id = "" mods_id = ""
listen_server = True listen_server = True
@ -37,7 +38,7 @@ def find_file(path):
return arr return arr
list_config = find_file(dir_config) list_config = find_file(dir_maps)
delist_config = find_file(dir_config+"deactivated") delist_config = find_file(dir_config+"deactivated")
@ -52,12 +53,6 @@ def create_dir(directory):
"""Проверка и создание директории""" """Проверка и создание директории"""
if not os.path.exists(directory): if not os.path.exists(directory):
os.mkdir(directory) os.mkdir(directory)
if not os.path.exists(f"{home_dir}/.config/hlna/"):
os.chdir(f"{home_dir}/.config/")
os.mkdir("hlna")
if not os.path.exists(f"{home_dir}/.config/hlna/maps"):
os.chdir(f"{home_dir}/.config/hlna/")
os.mkdir("maps")
def check_int(number=""): def check_int(number=""):
@ -74,8 +69,9 @@ def check_int(number=""):
create_dir(dir_server) create_dir(dir_server)
create_dir(dir_unit)
create_dir(dir_config) create_dir(dir_config)
create_dir(dir_maps)
@hlna.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов') @hlna.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов')
def config(list_config=list_config): def config(list_config=list_config):
@ -83,10 +79,10 @@ def config(list_config=list_config):
port_s = [] port_s = []
rcon_p = [] rcon_p = []
query_p = [] query_p = []
cluster_id = "" cluster_id = ""
cluster_dir_override = "" cluster_dir_override = ""
count_cluster = check_int("""Укажите требуется ли кластер? count_cluster = check_int("""Укажите требуется ли кластер?
1. Да 1. Да
2. Нет 2. Нет
@ -105,16 +101,16 @@ def config(list_config=list_config):
for i in list_config: for i in list_config:
data = read_yaml(i) data = read_yaml(i)
print(f"{i} : {data['map']}") print(f"{i} : {data['map']}")
# id_srv[data['SessionName']] = data['id_server'] # id_srv[data['SessionName']] = data['id_server']
count_maps = check_int("Укажите количество карт: \n") count_maps = check_int("Укажите количество карт: \n")
if count_maps == 0: # 0 возвращает check_int когда, ничего не было введено if count_maps == 0: # 0 возвращает check_int когда, ничего не было введено
count_maps = 1 count_maps = 1
for i in range(count_maps): for i in range(count_maps):
while True: while True:
"Проверка на выбор карты из списка" "Проверка на выбор карты из списка"
# os.system("clear") # os.system("clear")
amount_map = check_int("""Выберите карту из списка указав номер amount_map = check_int("""Выберите карту из списка указав номер
1. The Island 1. The Island
@ -182,10 +178,10 @@ def config(list_config=list_config):
print("Порт уже занят") print("Порт уже занят")
else: else:
return port return port
if list_config: if list_config:
data = read_yaml(list_config[-1]) data = read_yaml(list_config[-1])
while True: while True:
name_server = input("Укажите название Сервера: \n") name_server = input("Укажите название Сервера: \n")
if name_server == "": if name_server == "":
@ -195,7 +191,7 @@ def config(list_config=list_config):
while new_name in list_config: while new_name in list_config:
new_name = f"{map_s}{str(count)}" new_name = f"{map_s}{str(count)}"
count += 1 count += 1
list_config.append(new_name) list_config.append(new_name)
print(list_config) print(list_config)
break break
@ -212,12 +208,12 @@ def config(list_config=list_config):
port_server = ports(port_s) port_server = ports(port_s)
print("Укажите query порт сервера:\n") print("Укажите query порт сервера:\n")
query_port = ports(query_p) query_port = ports(query_p)
if port_server == 0: if port_server == 0:
port_server = 7777 port_server = 7777
if query_port == 0: if query_port == 0:
query_port = 27015 query_port = 27015
print("Порт Сервера=", port_server) print("Порт Сервера=", port_server)
print("Query Port=", query_port) print("Query Port=", query_port)
@ -234,54 +230,60 @@ def config(list_config=list_config):
max_players = 70 max_players = 70
systemd_unit_create(cluster_server, map_s, list_config[-1], port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override) systemd_unit_create(cluster_server, map_s, list_config[-1], port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override)
# yaml_create(cluster_server, map_s, list_config[-1], port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override) yaml_create(cluster_server, map_s, list_config[-1], port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override)
def systemd_unit_create(cluster_server, map_s, name_server, port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override) def yaml_create(cluster_server, map_s, name_server, port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override):
unit = f'''[Unit] settings_hlna = [
Description=ARK: Survival Evolved dedicated server {
'map' : map_s,
'Cluster' : cluster_server,
'SessionName' : name_server,
'Port' : port_server,
'QueryPort' : query_port,
'RCONEnabled' : rcon_enabled,
'RCONPort' : rcon_port,
'ServerAdminPassword': adminpassword_server,
'ServerPassword' : password_server,
'MaxPlayers' : max_players,
'ModsId' : mods_id,
'Listen' : listen_server,
'ServerPath' : dir_server,
'clusterid' : cluster_id,
'clusterdir' : cluster_dir_override
}
]
with open(dir_maps + f"{name_server}", 'w') as yamlfile:
yaml.dump(settings_hlna, yamlfile)
print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL)
def systemd_unit_create(cluster_server, map_s, name_server, port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override):
if not cluster_server:
ntff = ""
else:
ntff = "-NoTransferFromFiltering"
unit_file = f'{dir_unit}ARK_{name_server}.service'
unit_text = f'''[Unit]
Description=ARK: Survival Evolved dedicated server - {map_s}
Wants=network-online.target Wants=network-online.target
After=syslog.target network.target nss-lookup.target network-online.target After=syslog.target network.target nss-lookup.target network-online.target
[Service] [Service]
ExecStartPre=/home/steam/steamcmd +login anonymous +force_install_dir /home/steam/servers/ark +app_update 376030 +quit ExecStartPre=/usr/bin/steamcmd +force_install_dir {dir_server} +login anonymous +app_update 376030 +quit
ExecStart=/home/steam/servers/ark/ShooterGame/Binaries/Linux/ShooterGameServer TheIsland?listen?SessionName=<session_name> -server -log TimeoutStartSec=60
WorkingDirectory=/home/steam/servers/ark/ShooterGame/Binaries/Linux ExecStart={server_dir}ShooterGameServer {map_s}?{listen_server}?SessionName={name_server}?Port={port_server}?QueryPort={query_port}?RCONEnabled={rcon_enabled}?RCONPort={rcon_port}?ServerAdminPassword={adminpassword_server}?MaxPlayers={max_players} -clusterid={cluster_id}-ClusterDirOverride={cluster_dir_override} {ntff}
WorkingDirectory={server_dir}
LimitNOFILE=100000 LimitNOFILE=100000
ExecReload=/bin/kill -s HUP $MAINPID ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s INT $MAINPID ExecStop=/bin/kill -s INT $MAINPID
User=steam
Group=steam
[Install] [Install]
WantedBy=multi-user.target\ WantedBy=multi-user.target
''' '''
with open(unit, 'w') as systemd_unit: with open(unit_file, 'w') as systemd_unit:
systemd_unit.write(unit) systemd_unit.write(unit_text)
os.system('systemctl daemon-reload') os.system('systemctl daemon-reload')
# def yaml_create(cluster_server, map_s, name_server, port_server, query_port, rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, cluster_id, cluster_dir_override):
# settings_hlna = [
# {
# 'map' : map_s,
# 'Cluster' : cluster_server,
# 'SessionName' : name_server,
# 'Port' : port_server,
# 'QueryPort' : query_port,
# 'RCONEnabled' : rcon_enabled,
# 'RCONPort' : rcon_port,
# 'ServerAdminPassword': adminpassword_server,
# 'ServerPassword' : password_server,
# 'MaxPlayers' : max_players,
# 'ModsId' : mods_id,
# 'Listen' : listen_server,
# 'ServerPath' : dir_server,
# 'clusterid' : cluster_id,
# 'clusterdir' : cluster_dir_override
# }
# ]
# with open(dir_config + f"{name_server}", 'w') as yamlfile:
# yaml.dump(settings_hlna, yamlfile)
# print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL)
def test_mod_install(): def test_mod_install():
@ -420,7 +422,6 @@ def start(m, b, name_server=list_config):
else: else:
names_serverstart = choose_map(names_serverstart) names_serverstart = choose_map(names_serverstart)
server_dir = dir_server + "ShooterGame/Binaries/Linux/"
print_line("Валидация файлов сервера") print_line("Валидация файлов сервера")
x = os.system(f"steamcmd +force_install_dir {dir_server} +login anonymous +app_update 376030 +quit") x = os.system(f"steamcmd +force_install_dir {dir_server} +login anonymous +app_update 376030 +quit")
os.chdir(server_dir) os.chdir(server_dir)
@ -448,12 +449,12 @@ def start(m, b, name_server=list_config):
else: else:
print("Ни одной карты не установлено") print("Ни одной карты не установлено")
def read_yaml(name_server, flag=True): def read_yaml(name_server, flag=True):
# Читаем конфиги активных или неактивных карт в зависимости от флага # Читаем конфиги активных или неактивных карт в зависимости от флага
if flag: if flag:
dirs = f"{home_dir}/.config/hlna/maps/{name_server}" dirs = f"{dir_maps}{name_server}"
else: else:
dirs = f"{home_dir}/.config/hlna/deactivated/{name_server}" dirs = f"{home_dir}/.config/hlna/deactivated/{name_server}"
with open(dirs, "r") as yamlfile: with open(dirs, "r") as yamlfile:
@ -512,7 +513,5 @@ def zero(x=""):
return "" return ""
# if __name__ == 'hlna':
# input = zero
if __name__ == '__main__': if __name__ == '__main__':
hlna() hlna()