change if else and fix function servers

This commit is contained in:
Ваше Имя 2023-05-10 11:14:18 +03:00
parent 6faedaba52
commit d4eece79e3
6 changed files with 115 additions and 161 deletions

0
LICENSE.md Normal file → Executable file

0
README.md Normal file → Executable file

276
hlna.py

@ -1,28 +1,23 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os import os
import datetime import time
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}/Servers/" dir_server = f"{home_dir}/ARK_Servers/"
dir_server_ark = f"{dir_server}/ARK/" dir_config = f"{home_dir}/.config/hlna/maps/"
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 = ""
now = datetime.datetime.now() listen_server = True
date = now.strftime("%Y-%m-%d")
time = now.strftime("%H:%M:%S")
@click.group() @click.group()
@ -30,20 +25,6 @@ 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
@ -56,17 +37,28 @@ def find_file(path):
return arr return arr
list_config = find_file(dir_maps) list_config = find_file(dir_config)
delist_config = find_file(dir_deactivated) delist_config = find_file(dir_config+"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:
@ -77,36 +69,28 @@ def check_int(number=""):
x = int(x) x = int(x)
return x return x
except ValueError: except ValueError:
print_line("Введите число") print("Введите число")
@hlna.command(help='Сбор настроек для сервера или кластера') create_dir(dir_server)
def config(): create_dir(dir_config)
while True:
count_server = check_int("""Выберите игру для конфигурирования
1. ARK Survival Evolved
: """)
if count_server == 1:
config_ark()
break
else:
print_line("Пока есть только ARK xD")
def config_ark(list_config=list_config): @hlna.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов')
"""Сбор данных для конфига""" 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")
@ -120,14 +104,17 @@ def config_ark(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
@ -193,10 +180,11 @@ def config_ark(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 == "":
@ -206,6 +194,7 @@ def config_ark(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
@ -214,19 +203,20 @@ def config_ark(list_config=list_config):
break break
else: else:
if name_server in list_config: if name_server in list_config:
print_line("Имя занято") print("Имя занято")
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)
@ -241,87 +231,41 @@ def config_ark(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
print("Передавать сервер в глобальный список серверов steam?") 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_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, 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):
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_maps + f"{name_server}", 'w') as yamlfile: with open(dir_config + 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("Сервер не установлен")
@ -333,12 +277,11 @@ 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 = m.split(",") # m = check_name_map(m, False)
if not os.path.isdir(dir_deactivated): create_dir(dir_config + "deactivated")
create_dir(dir_deactivated)
if e == True: if e == True:
port_s = [] port_s = []
query_p = [] query_p = []
@ -354,41 +297,33 @@ 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?")
continue x = os.system(f"mv {dir_config}deactivated/{i} {dir_config + i} 2>> {dir_config}logs") #Добавить текущее время
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} либо уже активирована, либо такой карты нет")
finally: except:
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( x = os.system(f"mv {dir_config + i} {dir_config}deactivated/{i} 2>> {dir_config}logs") #Добавить текущее время
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 == []:
@ -414,10 +349,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"""
@ -433,8 +368,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="")
@ -461,19 +396,36 @@ 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)
os.system(f"systemctl --user start ARK_{data['SessionName']}.service") starting_map = dict_mapname[i]
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):
# Читаем конфиги активных или неактивных карт в зависимости от флага # Читаем конфиги активных или неактивных карт в зависимости от флага
if flag: dirs = f"{dir_config}{name_server}" if flag else f"{dir_config}deactivated/{name_server}"
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] # возвращаем словарь со всеми значениями
@ -483,27 +435,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 = {}
@ -514,7 +466,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}")
@ -530,5 +482,7 @@ def zero(x=""):
return "" return ""
# if __name__ == 'hlna':
# input = zero
if __name__ == '__main__': if __name__ == '__main__':
hlna() hlna()

0
hlna_discord_bot.py Normal file → Executable file

0
logo.png Normal file → Executable file

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

0
pytest.py Normal file → Executable file