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