diff --git a/hlna.py b/hlna.py index 2a75585..a6d7672 100755 --- a/hlna.py +++ b/hlna.py @@ -15,17 +15,14 @@ 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_ark = f"{dir_server_ark}ShooterGame/Binaries/Linux/" +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_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") @@ -49,8 +46,6 @@ create_dir(dir_config) create_dir(dir_logs) - - def find_file(path): """Находим все конфиги в зависимости от пути""" arr = next(os.walk(path), (None, None, []))[2] # [] if no file @@ -123,8 +118,8 @@ def config_ark(list_config=list_config): if count_cluster == 1: cluster_server = True cluster_id = input("Укажите id для кластера, любое сочетание символов: \n") - create_dir(dir_server + cluster_id) - cluster_dir_override = (dir_server + cluster_id) + create_dir(dir_server_ark + cluster_id) + cluster_dir_override = (dir_server_ark + cluster_id) else: cluster_server = False @@ -243,7 +238,6 @@ def config_ark(list_config=list_config): query_port = 27015 print("Query Port=", query_port) - rcon_enabled = True if rcon_p == []: rcon_port = 27020 @@ -258,9 +252,9 @@ def config_ark(list_config=list_config): print("Передавать сервер в глобальный список серверов steam?") listen_server_amount = check_int("""\n - 1. Да - 2. Нет - :""") +1. Да +2. Нет +:""") if listen_server_amount == 1: listen_server = True elif listen_server_amount == 2: @@ -268,7 +262,8 @@ 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, + 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) @@ -285,12 +280,13 @@ def config_7daystodie(): print_line("Запрещённые символы") else: xml_parser() - systemd_unit_create(game:="7Days", config_7days) + systemd_unit_create(game := "7Days", config_7days) 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 = [ @@ -307,7 +303,7 @@ def yaml_create(game, cluster_server, map_s, name_server, port_server, query_por 'MaxPlayers': max_players, 'ModsId': mods_id, 'Listen': listen_server, - 'ServerPath': dir_server, + 'ServerPath': dir_server_ark, 'clusterid': cluster_id, 'clusterdir': cluster_dir_override } @@ -324,13 +320,15 @@ def systemd_unit_create(game, config_7days="", name_server=list_config): for i in name_server: data = read_yaml(i) ntff = "" if not data['Cluster'] else "-NoTransferFromFiltering" - systemd_unit_exec = f"{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}" - unit_file = f"{dir_unit}ARK_{data['SessionName']}.service" + 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}" + unit_file = f"{dir_unit}ark_{data['SessionName']}.service".lower() elif game == "7Days": id_game = "294420" - #сюда дописать обращение к xml для получения уникального имени сервера + # сюда дописать обращение к xml для получения уникального имени сервера + unit_dir_server = dir_server_7days systemd_unit_exec = f"{dir_server_7days}startserver.sh -configfile={config_7days}.xml" - unit_file = f"{dir_unit}7Days.service" + unit_file = f"{dir_config}7days.service".lower() unit_text = f'''[Unit] Description={game}: Server @@ -338,7 +336,7 @@ 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 {id_game} +quit +ExecStartPre=/usr/bin/steamcmd +force_install_dir {unit_dir_server} +login anonymous +app_update {id_game} +quit TimeoutStartSec=99999 ExecStart={systemd_unit_exec} LimitNOFILE=100000 @@ -350,23 +348,24 @@ WantedBy=default.target ''' with open(unit_file, 'w') as systemd_unit: systemd_unit.write(unit_text) - os.system(f"systemctl --user unmask {unit_file}") - os.system(f"systemctl --user enable {unit_file}") + unit_name = unit_file.split("/")[-1] + os.system(f"systemctl --user unmask {unit_name}") os.system('systemctl --user daemon-reload') + os.system(f"systemctl --user enable {unit_name}") -def test_mod_install(): - pathTest = f"{dir_server}ShooterGame/Saved/Config/LinuxServer/" - if os.path.exists(pathTest): - os.chdir(pathTest) - # "Добавить файл в Game.ini, если модов несколько добавляем еще строку ModIDS= [ModInstaller] ModIDS=" - # c этим не разобрался - os.system("echo ActiveMods=2943454417 >> GameUserSettings.ini") - else: - print_line("Сервер не установлен") - - -test_mod_install() +# def test_mod_install(): +# pathTest = f"{dir_server_ark}ShooterGame/Saved/Config/LinuxServer/" +# if os.path.exists(pathTest): +# os.chdir(pathTest) +# # "Добавить файл в Game.ini, если модов несколько добавляем еще строку ModIDS= [ModInstaller] ModIDS=" +# # c этим не разобрался +# os.system("echo ActiveMods=2943454417 >> GameUserSettings.ini") +# else: +# print_line("Сервер не установлен") +# +# +# test_mod_install() @hlna.command() @@ -396,7 +395,8 @@ def enablemap(m, e): if data['QueryPort'] in query_p: print("Заменить query port?") continue - x = os.system(f"mv {dir_deactivated}{i} {dir_maps_ark} >> {dir_logs}{date} 2>&1") # Добавить текущее время + x = os.system( + f"mv {dir_deactivated}{i} {dir_maps_ark} >> {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_ark}\n") if x == 0: @@ -407,7 +407,7 @@ def enablemap(m, e): pass # except: # print("ошибка при активации карты") - # pass + # pass else: for i in m: try: @@ -430,7 +430,7 @@ def enablemap(m, e): def servers(map_server=list_config): # Добавить сортивку по кластерам и вывод несколько столбиков if map_server == [] and delist_config == []: - print("Сервера не установлены") + print("Сервера не сконфигурированы") else: for i in map_server: data = read_yaml(i) @@ -474,10 +474,47 @@ def servers(map_server=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(m, b, name_server=list_config): - dict_mapname = {} +def start(g, m, b, name_server=list_config): + if g == "ark": + dict_mapname = {} + dict_allmapname = [] + for i in name_server: + data = read_yaml(i) + print_line(f"Название сервера: {i} | Карта: {data['map']} | Кластер: {data['clusterid']}") + dict_mapname[data['SessionName']] = data['map'] + dict_allmapname.append(data['SessionName']) + print_line(f"Словарь названия сервера и карты {dict_mapname}") + names_serverstart = [] + for ns, v in dict_mapname.items(): + print_line(f"переменные v и m {v} & {m}") + if v in m: + names_serverstart.append(ns) + print_line(f"Карта которая запускается {ns}") + if name_server != []: + 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) + x = os.system(f"systemctl --user start ark_{data['SessionName'].lower()}.service") + print_line(x) + else: + print("Ни одной карты не установлено") + +@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, name_server=list_config) + if g == "ark": + dict_mapname = {} dict_allmapname = [] for i in name_server: data = read_yaml(i) @@ -496,19 +533,21 @@ def start(m, b, name_server=list_config): if m == "all": names_serverstart = dict_allmapname print(f"Запускаем все активные карты {names_serverstart}") - else: - names_serverstart = choose_map(names_serverstart) + else: + names_serverstart = choose_map(names_serverstart) for i in names_serverstart: data = read_yaml(i) - os.system(f"systemctl --user start ARK_{data['SessionName']}.service") - else: - print("Ни одной карты не установлено") + rcon(m, "SaveWorld") + x = os.system(f"systemctl --user stop ark_{data['SessionName'].lower()}.service") + print_line(x) + else: + print("Ни одной карты не установлено") def read_yaml(list_config, flag=True): # Читаем конфиги активных или неактивных карт в зависимости от флага - dirs = f"{dir_maps_ark}{list_config}" if flag else f"{dir_deactivated}{list_config}" + dirs = f"{dir_maps_ark}{list_config}" if flag else f"{dir_deactivated}{list_config}" with open(dirs, "r") as yamlfile: data = yaml.load(yamlfile, Loader=yaml.FullLoader) return data[0] # возвращаем словарь со всеми значениями