This commit is contained in:
Евгений Храмов 2023-05-13 23:13:01 +03:00
parent 8452a0c3c3
commit 08117b8508

190
hlna.py

@ -10,40 +10,6 @@ from pathlib import Path
from rcon.source import Client
home_dir = Path.home()
dir_config = f"{home_dir}/.config/hlna/"
dir_unit = f"{home_dir}/.config/systemd/user/"
dir_server = f"{home_dir}/Servers/"
dir_logs = f"{dir_config}logs/"
dir_server_ark = f"{dir_server}ARK/"
dir_server_exec = f"{dir_server_ark}ShooterGame/Binaries/Linux/"
dir_maps_ark = f"{dir_config}/ARK/"
dir_deactivated = f"{dir_maps_ark}deactivated/"
dir_server_7days = f"{dir_server}/7Days/"
mods_id = ""
now = datetime.datetime.now()
date = now.strftime("%Y-%m-%d")
time = now.strftime("%H:%M:%S")
@click.group()
def hlna():
pass
def create_dir(directory):
"""Проверка и создание директории"""
if not os.path.exists(directory):
os.makedirs(directory)
create_dir(dir_server)
create_dir(dir_unit)
create_dir(dir_config)
create_dir(dir_logs)
def find_file(path):
@ -58,10 +24,32 @@ def find_file(path):
return arr
dir_config = f"{home_dir}/.config/hlna/"
dir_maps_ark = f"{dir_config}/ARK/"
dir_deactivated = f"{dir_maps_ark}deactivated/"
list_config = find_file(dir_maps_ark)
delist_config = find_file(dir_deactivated)
def path_server():
dir_server = input(f"""Укажите путь до каталога, где будут храниться файлы сервера. По-умолчанию {home_dir}/Servers/
:""")
if dir_server == "":
dir_server = f"{home_dir}/Servers/"
yaml_create(game := "path_server", dir_server)
return dir_server
@click.group()
def hlna():
pass
def create_dir(directory):
"""Проверка и создание директории"""
if not os.path.exists(directory):
os.makedirs(directory)
def print_line(text):
"""Добавление тире вокруг текста, покраска"""
print(colorama.Fore.YELLOW + "-" * 30)
@ -126,7 +114,7 @@ def config_ark(list_config=list_config):
if list_config:
print("Уже установленные карты: ")
for i in list_config:
data = read_yaml(i)
data = read_yaml(i, game="ARK")
print(f"{i} : {data['map']}")
count_maps = check_int("Укажите количество карт: \n")
@ -157,7 +145,7 @@ def config_ark(list_config=list_config):
if list_config:
for i in list_config:
data = read_yaml(i)
data = read_yaml(i, game="ARK")
port_s.append(data['Port'])
rcon_p.append(data['RCONPort'])
query_p.append(data['QueryPort'])
@ -204,7 +192,7 @@ def config_ark(list_config=list_config):
return port
if list_config:
data = read_yaml(list_config[-1])
data = read_yaml(list_config[-1], game="ARK")
while True:
name_server = input("Укажите название Сервера: \n")
if name_server == "":
@ -262,9 +250,7 @@ def config_ark(list_config=list_config):
else:
listen_server = True
yaml_create(game := "ARK", 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)
yaml_create(game := "ARK", dir_server := "", 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 config_7daystodie():
@ -287,9 +273,13 @@ def xml_parser():
print("Я не умею парсить))")
def yaml_create(game, 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 = [
def yaml_create(game, dir_server="", cluster_server="", map_s="", name_server="", port_server="", query_port="", rcon_enabled="", rcon_port="",
adminpassword_server="", password_server="", max_players="", id_mods_ark="", cluster_id="", cluster_dir_override="", listen_server=""):
if game == "ARK":
print_line(dir_maps_ark)
print_line(name_server)
path_yaml = dir_maps_ark + name_server
settings = [
{
'map': map_s,
'Cluster': cluster_server,
@ -301,24 +291,31 @@ def yaml_create(game, cluster_server, map_s, name_server, port_server, query_por
'ServerAdminPassword': adminpassword_server,
'ServerPassword': password_server,
'MaxPlayers': max_players,
'ModsId': mods_id,
'ModsId': id_mods_ark,
'Listen': listen_server,
'ServerPath': dir_server_ark,
'clusterid': cluster_id,
'clusterdir': cluster_dir_override
}
]
with open(dir_maps_ark + f"{name_server}", 'w') as yamlfile:
yaml.dump(settings_hlna, yamlfile)
print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL)
elif game == "path_server":
path_yaml = dir_config + "config"
settings = [
{
'path_server': dir_server
}
]
elif game != "":
systemd_unit_create(game)
with open(path_yaml, 'w') as yamlfile:
yaml.dump(settings, yamlfile)
print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL)
def systemd_unit_create(game, config_7days="", name_server=list_config):
if game == "ARK":
id_game = "376030"
for i in name_server:
data = read_yaml(i)
data = read_yaml(i, game="ARK")
ntff = "" if not data['Cluster'] else "-NoTransferFromFiltering"
unit_dir_server = dir_server_ark
systemd_unit_exec = f"{dir_server_exec}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}"
@ -354,19 +351,18 @@ WantedBy=default.target
os.system(f"systemctl --user enable {unit_name}")
# def test_mod_install():
# pathTest = f"{dir_server_ark}ShooterGame/Saved/Config/LinuxServer/"
# if os.path.exists(pathTest):
# os.chdir(pathTest)
# # "Добавить файл в Game.ini, если модов несколько добавляем еще строку ModIDS=<ModId> [ModInstaller] ModIDS=<ModID>"
# # c этим не разобрался
# os.system("echo ActiveMods=2943454417 >> GameUserSettings.ini")
# else:
# print_line("Сервер не установлен")
#
#
# test_mod_install()
@hlna.command(help='Для скачивания и установки модов')
@click.option('-g', help="Название игры для запуска. (ark, 7days")
@click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт")
def modinstall(g, m):
if g == "ark":
id_game = "346110"
if not os.path.isdir(dir_workshop_ark):
create_dir(dir_workshop_ark)
id_mods_ark = input("""Укажите id модов через запятую
:""")
os.environ.get('mod_branch', 'Windows')
os.system(f"steamcmd +login anonymous +workshop_download_item {id_game} {id_mods_ark} +quit")
@hlna.command()
@click.option("-m", required=True, help="Название Сервера")
@ -433,7 +429,7 @@ def servers(list_config=list_config):
print("Сервера не сконфигурированы")
else:
for i in list_config:
data = read_yaml(i)
data = read_yaml(i, game="ARK")
x = os.system(f"lsof -w -i :{data['Port']}")
if x == 0:
print(colorama.Fore.GREEN + "Сервер запущен" + colorama.Style.RESET_ALL)
@ -476,33 +472,30 @@ def servers(list_config=list_config):
@hlna.command(help='Для запуска, сконфигурированного сервера или кластера')
@click.option('-g', help="Название игры для запуска. (ark, 7days")
@click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт")
@click.option('-b', default='', help="")
def start(g, m, b):
start_stop("start", g, m, b)
def start(g, m):
start_stop("start", g, m)
@hlna.command(help='Для запуска, сконфигурированного сервера или кластера')
@hlna.command(help='Для остановки, сконфигурированного сервера или кластера')
@click.option('-g', help="Название игры для запуска. (ark, 7days")
@click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт")
@click.option('-b', default='', help="")
def stop(g, m, b):
start_stop("stop", g, m, b)
def stop(g, m):
start_stop("stop", g, m)
@hlna.command(help='Для запуска, сконфигурированного сервера или кластера')
@hlna.command(help='Для перезапуска, сконфигурированного сервера или кластера')
@click.option('-g', help="Название игры для запуска. (ark, 7days")
@click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт")
@click.option('-b', default='', help="")
def restart(g, m, b):
start_stop("restart", g, m, b)
def restart(g, m):
start_stop("restart", g, m)
def start_stop(action, g, m, b, list_config=list_config):
def start_stop(action, g, m, list_config=list_config):
if g == "ark":
dict_mapname = {}
dict_allmapname = []
for i in list_config:
data = read_yaml(i)
data = read_yaml(i, game="ARK")
dict_mapname[data['SessionName']] = data['map']
dict_allmapname.append(data['SessionName'])
names_serverstart = []
@ -510,14 +503,13 @@ def start_stop(action, g, m, b, list_config=list_config):
if v in m:
names_serverstart.append(ns)
if list_config != []: #Перенести выше для проверки наличия конфигов
if b == '':
if m == "all":
names_serverstart = dict_allmapname
print(f"Выполняется для карт(-ы) {names_serverstart}")
else:
names_serverstart = choose_map(names_serverstart)
for i in names_serverstart:
data = read_yaml(i)
data = read_yaml(i, game="ARK")
y = os.system(f"~/git/hln-a/hlna.py rcon SaveWorld -m {i}") if action == "restart" or action == "stop" else ""
x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service")
print_line(y)
@ -531,10 +523,13 @@ def start_stop(action, g, m, b, list_config=list_config):
print_line("Готово")
def read_yaml(list_config, flag=True):
def read_yaml(list_config=list_config, flag=True, game=""):
# Читаем конфиги активных или неактивных карт в зависимости от флага
dirs = f"{dir_maps_ark}{list_config}" if flag else f"{dir_deactivated}{list_config}"
with open(dirs, "r") as yamlfile:
if game == "ARK":
path_yaml = f"{dir_maps_ark}{list_config}" if flag else f"{dir_deactivated}{list_config}"
elif game == "path_server":
path_yaml = dir_config + "config"
with open(path_yaml, "r") as yamlfile:
data = yaml.load(yamlfile, Loader=yaml.FullLoader)
return data[0] # возвращаем словарь со всеми значениями
@ -571,7 +566,7 @@ def rcon(m, c):
if list_config:
rcon_ports = []
for i in list_config:
data = read_yaml(i)
data = read_yaml(i, game="ARK")
dict_mapname[data['RCONPort']] = data['map']
dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword']
if m == "all":
@ -597,5 +592,36 @@ def zero(x=""):
return ""
if not os.path.exists(dir_config + "config"):
dir_server = path_server()
else:
print_line("else")
data = read_yaml(game="path_server")
if data['path_server'] == "":
path_server()
else:
print_line(data['path_server'])
dir_server = data['path_server']
dir_unit = f"{home_dir}/.config/systemd/user/"
dir_logs = f"{dir_config}logs/"
dir_server_ark = f"{dir_server}ARK/"
dir_workshop_ark = f"{dir_server_ark}steamapps/workshop/"
dir_server_exec = f"{dir_server_ark}ShooterGame/Binaries/Linux/"
dir_server_7days = f"{dir_server}/7Days/"
now = datetime.datetime.now()
date = now.strftime("%Y-%m-%d")
time = now.strftime("%H:%M:%S")
create_dir(dir_server)
create_dir(dir_unit)
create_dir(dir_config)
create_dir(dir_logs)
if __name__ == '__main__':
hlna()