Revert "change if else and fix function servers"

This reverts commit d4eece79e3a7f904a5424a98c68b626c8075ec1a.
This commit is contained in:
Евгений Храмов 2023-05-10 12:23:31 +03:00
parent fdccb54b45
commit cbecbcecda
6 changed files with 161 additions and 115 deletions

0
LICENSE.md Executable file → Normal file

0
README.md Executable file → Normal file

276
hlna.py

@ -1,23 +1,28 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os import os
import time import datetime
import threading
from pathlib import Path
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}/Servers/"
dir_config = f"{home_dir}/.config/hlna/maps/" dir_server_ark = f"{dir_server}/ARK/"
server_dir = f"{dir_server_ark}ShooterGame/Binaries/Linux/"
dir_unit = f"{home_dir}/.config/systemd/user/"
dir_config = f"{home_dir}/.config/hlna/"
dir_logs = f"{dir_config}logs/"
dir_maps = f"{dir_config}maps/"
dir_deactivated = f"{dir_maps}deactivated/"
mods_id = "" mods_id = ""
listen_server = True now = datetime.datetime.now()
date = now.strftime("%Y-%m-%d")
time = now.strftime("%H:%M:%S")
@click.group() @click.group()
@ -25,6 +30,20 @@ def hlna():
pass pass
def create_dir(directory):
"""Проверка и создание директории"""
if not os.path.exists(directory):
os.mkdir(directory)
create_dir(dir_server)
create_dir(dir_server_ark)
create_dir(dir_unit)
create_dir(dir_config)
create_dir(dir_logs)
create_dir(dir_maps)
def find_file(path): def find_file(path):
"""Находим все конфиги в зависимости от пути""" """Находим все конфиги в зависимости от пути"""
arr = next(os.walk(path), (None, None, []))[2] # [] if no file arr = next(os.walk(path), (None, None, []))[2] # [] if no file
@ -37,28 +56,17 @@ 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_deactivated)
def print_line(text): def print_line(text):
"""Добавление тире вокруг текста, покраска""" """Добавление тире вокруг текста, покраска"""
print(colorama.Fore.YELLOW + "-"*30) print(colorama.Fore.YELLOW + "-" * 30)
print(f"{colorama.Fore.GREEN} + {text}") print(f"{colorama.Fore.GREEN} + {text}")
print(colorama.Fore.YELLOW + "-"*30 + colorama.Style.RESET_ALL) print(colorama.Fore.YELLOW + "-" * 30 + colorama.Style.RESET_ALL)
def create_dir(directory):
"""Проверка и создание директории"""
if not os.path.exists(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=""):
"""Проверка на ввод числа""" """Проверка на ввод числа"""
while True: while True:
@ -69,28 +77,36 @@ def check_int(number=""):
x = int(x) x = int(x)
return x return x
except ValueError: except ValueError:
print("Введите число") print_line("Введите число")
create_dir(dir_server) @hlna.command(help='Сбор настроек для сервера или кластера')
create_dir(dir_config) def config():
while True:
count_server = check_int("""Выберите игру для конфигурирования
1. ARK Survival Evolved
: """)
if count_server == 1:
config_ark()
break
else:
print_line("Пока есть только ARK xD")
@hlna.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов') def config_ark(list_config=list_config):
def config(list_config=list_config): """Сбор данных для конфига"""
data = {} data = {}
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. Нет
: """) : """)
if count_cluster == 1: if count_cluster == 1:
cluster_server = True cluster_server = True
cluster_id = input("Укажите id для кластера, любое сочетание символов: \n") cluster_id = input("Укажите id для кластера, любое сочетание символов: \n")
@ -104,17 +120,14 @@ 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']
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")
amount_map = check_int("""Выберите карту из списка указав номер amount_map = check_int("""Выберите карту из списка указав номер
1. The Island 1. The Island
2. The Center 2. The Center
@ -180,11 +193,10 @@ def config(list_config=list_config):
if port in ports_arr: if port in ports_arr:
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 == "":
@ -194,7 +206,6 @@ 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
@ -203,20 +214,19 @@ def config(list_config=list_config):
break break
else: else:
if name_server in list_config: if name_server in list_config:
print("Имя занято") print_line("Имя занято")
else: else:
list_config.append(name_server) # если enter, то ставим последним элементом карту list_config.append(name_server) # если enter, то ставим последним элементом карту
break break
print("Укажите порт сервера:\n") print("Укажите порт сервера:\n")
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)
@ -231,41 +241,87 @@ def config(list_config=list_config):
max_players = check_int("Укажите максимальное количество игроков: \n") max_players = check_int("Укажите максимальное количество игроков: \n")
if max_players == 0: if max_players == 0:
max_players = 70 max_players = 70
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) print("Передавать сервер в глобальный список серверов steam?")
listen_server_amount = check_int("""\n
1. Да
2. Нет
:""")
if listen_server_amount == 1:
listen_server = True
elif listen_server_amount == 2:
listen_server = False
else:
listen_server = True
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, listen_server)
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): 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, listen_server):
settings_hlna = [ settings_hlna = [
{ {
'map' : map_s, 'map': map_s,
'Cluster' : cluster_server, 'Cluster': cluster_server,
'SessionName' : name_server, 'SessionName': name_server,
'Port' : port_server, 'Port': port_server,
'QueryPort' : query_port, 'QueryPort': query_port,
'RCONEnabled' : rcon_enabled, 'RCONEnabled': rcon_enabled,
'RCONPort' : rcon_port, 'RCONPort': rcon_port,
'ServerAdminPassword': adminpassword_server, 'ServerAdminPassword': adminpassword_server,
'ServerPassword' : password_server, 'ServerPassword': password_server,
'MaxPlayers' : max_players, 'MaxPlayers': max_players,
'ModsId' : mods_id, 'ModsId': mods_id,
'Listen' : listen_server, 'Listen': listen_server,
'ServerPath' : dir_server, 'ServerPath': dir_server,
'clusterid' : cluster_id, 'clusterid': cluster_id,
'clusterdir' : cluster_dir_override 'clusterdir': cluster_dir_override
} }
] ]
with open(dir_config + f"{name_server}", 'w') as yamlfile: with open(dir_maps + f"{name_server}", 'w') as yamlfile:
yaml.dump(settings_hlna, yamlfile) yaml.dump(settings_hlna, yamlfile)
print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL) print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL)
systemd_unit_create()
def systemd_unit_create(name_server=list_config):
for i in name_server:
data = read_yaml(i)
if not data['Cluster']:
ntff = ""
else:
ntff = "-NoTransferFromFiltering"
unit_file = f"{dir_unit}ARK_{data['SessionName']}.service"
unit_text = f'''[Unit]
Description=ARK: Survival Evolved dedicated server - {data['map']}
Wants=network-online.target
After=syslog.target network.target nss-lookup.target network-online.target
[Service]
ExecStartPre=/usr/bin/steamcmd +force_install_dir {dir_server} +login anonymous +app_update 376030 +quit
TimeoutStartSec=1200
ExecStart={dir_server_ark}ShooterGameServer {data['map']}?listen={data['Listen']}?SessionName={data['SessionName']}?Port={data['Port']}?QueryPort={data['QueryPort']}?RCONEnabled={data['RCONEnabled']}?RCONPort={data['RCONPort']}?ServerAdminPassword={data['ServerAdminPassword']}?MaxPlayers={data['MaxPlayers']} -clusterid={data['clusterid']} -ClusterDirOverride={data['clusterdir']} {ntff}
LimitNOFILE=100000
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s INT $MAINPID
[Install]
WantedBy=default.target
'''
with open(unit_file, 'w') as systemd_unit:
systemd_unit.write(unit_text)
os.system(f"systemctl --user unmask ARK_{data['SessionName']}.service")
os.system(f"systemctl --user enable ARK_{data['SessionName']}.service")
os.system('systemctl --user daemon-reload')
def test_mod_install(): def test_mod_install():
pathTest = f"{dir_server}ShooterGame/Saved/Config/LinuxServer/" pathTest = f"{dir_server}ShooterGame/Saved/Config/LinuxServer/"
if os.path.exists(pathTest): if os.path.exists(pathTest):
os.chdir(pathTest) os.chdir(pathTest)
# "Добавить файл в Game.ini, если модов несколько добавляем еще строку ModIDS=<ModId> [ModInstaller] ModIDS=<ModID>" # "Добавить файл в Game.ini, если модов несколько добавляем еще строку ModIDS=<ModId> [ModInstaller] ModIDS=<ModID>"
# c этим не разобрался # c этим не разобрался
os.system("echo ActiveMods=2943454417 >> GameUserSettings.ini") os.system("echo ActiveMods=2943454417 >> GameUserSettings.ini")
else: else:
print_line("Сервер не установлен") print_line("Сервер не установлен")
@ -277,11 +333,12 @@ test_mod_install()
@hlna.command() @hlna.command()
@click.option("-m", required=True, help="Название Сервера") @click.option("-m", required=True, help="Название Сервера")
@click.option("-e/-d", default=True, help="-e активировать карты, -d деактивировать") @click.option("-e/-d", default=True, help="-e активировать карты, -d деактивировать")
def enablemap(m,e): def enablemap(m, e):
"""Тут переписать надо""" """Включение/выключение карт"""
m = m.split(",")
# m = check_name_map(m, False) m = m.split(",")
create_dir(dir_config + "deactivated") if not os.path.isdir(dir_deactivated):
create_dir(dir_deactivated)
if e == True: if e == True:
port_s = [] port_s = []
query_p = [] query_p = []
@ -297,33 +354,41 @@ def enablemap(m,e):
data = read_yaml(i) data = read_yaml(i)
if data['Port'] in port_s: if data['Port'] in port_s:
print("Предлагаем заменить") print("Предлагаем заменить")
continue
if data['QueryPort'] in query_p: if data['QueryPort'] in query_p:
print("Заменить query port?") print("Заменить query port?")
x = os.system(f"mv {dir_config}deactivated/{i} {dir_config + i} 2>> {dir_config}logs") #Добавить текущее время continue
x = os.system(f"mv {dir_deactivated}{i} {dir_maps} >> {dir_logs}{date} 2>&1") # Добавить текущее время
with open(f"{dir_logs}{date}.log", "a") as f:
f.write(f"[{time}] File {i} has been moved to {dir_maps}\n")
if x == 0: if x == 0:
print(f"Карта активирована - {i}") print(f"Карта активирована - {i}")
else: else:
print(f"{i} либо уже активирована, либо такой карты нет") print(f"{i} либо уже активирована, либо такой карты нет")
except: finally:
print("ошибка")
pass pass
# except:
# print("ошибка при активации карты")
# pass
else: else:
for i in m: for i in m:
try: try:
if i in delist_config: if i in delist_config:
print(f"Карта {i} уже есть в деактивированных") print(f"Карта {i} уже есть в деактивированных")
continue continue
x = os.system(f"mv {dir_config + i} {dir_config}deactivated/{i} 2>> {dir_config}logs") #Добавить текущее время x = os.system(
f"mv {dir_maps}{i} {dir_deactivated} >> {dir_logs}{date} 2>&1") # Добавить текущее время
with open(f"{dir_logs}{date}.log", "a") as f:
f.write(f"[{time}] File {i} has been moved to {dir_deactivated}\n")
if x == 0: if x == 0:
print(f"Карта деактивирована - {i}") print(f"Карта деактивирована - {i}")
else: else:
print(f"{i} либо деактивирована, либо такой карты нет") print(f"{i} либо деактивирована, либо такой карты нет")
except: except:
pass pass
@hlna.command()
@hlna.command()
def servers(map_server=list_config): def servers(map_server=list_config):
# Добавить сортивку по кластерам и вывод несколько столбиков # Добавить сортивку по кластерам и вывод несколько столбиков
if map_server == [] and delist_config == []: if map_server == [] and delist_config == []:
@ -349,10 +414,10 @@ def servers(map_server=list_config):
Rcon порт : {data['RCONPort']} Rcon порт : {data['RCONPort']}
Максимальное кол-во игроков: {data['MaxPlayers']}""") Максимальное кол-во игроков: {data['MaxPlayers']}""")
print("-" * 40) print("-" * 40)
if delist_config!=[]: if delist_config != []:
x = input("Есть неактивные сервера, показать Y/n: ") x = input("Есть неактивные сервера, показать Y/n: ")
if x!="n": if x != "n":
for i in delist_config: for i in delist_config:
data = read_yaml(i, False) data = read_yaml(i, False)
print(f""" print(f"""
@ -368,8 +433,8 @@ def servers(map_server=list_config):
Rcon порт : {data['RCONPort']} Rcon порт : {data['RCONPort']}
Максимальное кол-во игроков: {data['MaxPlayers']}""") Максимальное кол-во игроков: {data['MaxPlayers']}""")
print("-" * 40) print("-" * 40)
@hlna.command(help='Для запуска, сконфигурированного сервера или кластера') @hlna.command(help='Для запуска, сконфигурированного сервера или кластера')
@click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт")
@click.option('-b', default='', help="") @click.option('-b', default='', help="")
@ -396,36 +461,19 @@ 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("Валидация файлов сервера")
x = os.system(f"steamcmd +force_install_dir {dir_server} +login anonymous +app_update 376030 +quit")
os.chdir(server_dir)
for i in names_serverstart: for i in names_serverstart:
data = read_yaml(i) data = read_yaml(i)
starting_map = dict_mapname[i] os.system(f"systemctl --user start ARK_{data['SessionName']}.service")
print_line(data['Cluster'])
ntff = '' if not data['Cluster'] else "-NoTransferFromFiltering"
def starting(i):
os.system(f"{server_dir}ShooterGameServer {i}?SessionName={data['SessionName']}?Port={data['Port']}\
?QueryPort={data['QueryPort']}?RCONEnabled={data['RCONEnabled']}?RCONPort={data['RCONPort']}\
?ServerAdminPassword={data['ServerAdminPassword']}?MaxPlayers={data['MaxPlayers']}\
?GameModIds={data['ModsId']}?listen={data['Listen']} -clusterid={data['clusterid']}\
-ClusterDirOverride={data['clusterdir']} {ntff}")
if x == 0:
print_line("Запускаем карту" + i)
threads = threading.Thread(target=starting, args=(starting_map,))
threads.start()
else:
print(f"Карта не запущена, сервер не установлен")
else: else:
print("Ни одной карты не установлено") print("Ни одной карты не установлено")
def read_yaml(name_server, flag=True):
def read_yaml(list_config, flag=True):
# Читаем конфиги активных или неактивных карт в зависимости от флага # Читаем конфиги активных или неактивных карт в зависимости от флага
dirs = f"{dir_config}{name_server}" if flag else f"{dir_config}deactivated/{name_server}" if flag:
dirs = f"{dir_maps}{list_config}"
else:
dirs = f"{dir_deactivated}{list_config}"
with open(dirs, "r") as yamlfile: with open(dirs, "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader) data = yaml.load(yamlfile, Loader=yaml.FullLoader)
return data[0] # возвращаем словарь со всеми значениями return data[0] # возвращаем словарь со всеми значениями
@ -435,27 +483,27 @@ def choose_map(arr):
new_arr = [] new_arr = []
arr = sorted(arr) arr = sorted(arr)
print('Найдены сервера с этой картой') print('Найдены сервера с этой картой')
for i,map in enumerate(arr): for i, map in enumerate(arr):
print(f"{i+1}) {map}") print(f"{i + 1}) {map}")
while True: while True:
try: try:
x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',')
x = [int (i) for i in x] x = [int(i) for i in x]
break break
except: except:
print("Неправильный ввод") print("Неправильный ввод")
for i in x: for i in x:
new_arr.append(arr[i-1]) new_arr.append(arr[i - 1])
print('Выбранные сервера:', new_arr) print('Выбранные сервера:', new_arr)
return new_arr return new_arr
@hlna.command() @hlna.command()
@click.argument('c', nargs=1) @click.argument('c', nargs=1)
@click.option('-m', required=True, help="Название карты для применения rcon команды") @click.option('-m', required=True, help="Название карты для применения rcon команды")
def rcon(m,c): def rcon(m, c):
print_line("Команда: ", c) print_line("Команда: ", c)
print_line("Карты: ", m) print_line("Карты: ", m)
dict_mapname = {} dict_mapname = {}
@ -466,7 +514,7 @@ def rcon(m,c):
dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword']
rcon_ports = [] rcon_ports = []
for ns, v in dict_mapname.items(): for ns, v in dict_mapname.items():
print_line(f"переменные v и m {v} & {m}") # обьединить с таким же блоком в start() print_line(f"переменные v и m {v} & {m}") # обьединить с таким же блоком в start()
if v in m: if v in m:
rcon_ports.append(ns) rcon_ports.append(ns)
print_line(f"Карта которая запускается {ns}") print_line(f"Карта которая запускается {ns}")
@ -482,7 +530,5 @@ def zero(x=""):
return "" return ""
# if __name__ == 'hlna':
# input = zero
if __name__ == '__main__': if __name__ == '__main__':
hlna() hlna()

0
hlna_discord_bot.py Executable file → Normal file

0
logo.png Executable file → Normal file

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

0
pytest.py Executable file → Normal file