#!/usr/bin/env python3 import os import re import yaml import threading from pathlib import Path import click import colorama home_dir = Path.home() dir_server = f"{home_dir}/ARK_Servers/" config_hlna = f"{home_dir}/.config/hlna/" mods_id = "" listen_server = True @click.group() def hlna(): pass list_config = next(os.walk(config_hlna), (None, None, []))[2] # [] if no file x = list_config.count('.directory') y = list_config.count('logs') if x>0: list_config.remove('.directory') if y>0: list_config.remove('logs') delist_config = next(os.walk(config_hlna+"deactivated"), (None, None, []))[2] # [] if no file x = list_config.count('.directory') y = list_config.count('logs') if x>0: list_config.remove('.directory') if y>0: list_config.remove('logs') def print_line(text): "Добавление тире вокруг текста, покраска" print(colorama.Fore.YELLOW + "-"*30) print(colorama.Fore.GREEN + text) print(colorama.Fore.YELLOW + "-"*30 + colorama.Style.RESET_ALL) def create_dir(directory): "Проверка и создание директории" if not os.path.exists(directory): os.mkdir(directory) def check_int(number=""): "Проверка на ввод числа" while True: try: x = input(number) if x == "": return 0 x = x.replace(' ', '') x = x.replace(',', '') x = int(x) return x except ValueError: print("Введите число") create_dir(dir_server) create_dir(config_hlna) @hlna.command(help='Для конфигурирования параметров запускаемого сервера или кластера серверов') def config(map_server=list_config): query_p = [] port_s = [] cluster_dir_override = "" cluster_id = "" count_cluster = check_int("""Укажите требуется ли кластер? 1. Да 2. Нет : """) if count_cluster == 0: # 0 возвращает функция chek_int, если ничего не было введено count_cluster = 2 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) else: cluster_server = False if map_server != []: print("Уже установленные карты: ") for i in map_server: print(i) count_maps = check_int("Укажите количество карт: \n") if count_maps == 0: # 0 возрвращает check_int когда, ничего не было введено count_maps = 1 print for i in range(count_maps): while True: "Проверка на выбор карты из списка" for k in map_server: with open(f"{home_dir}/.config/hlna/{k}", "r") as yamlfile: data = yaml.load(yamlfile, Loader=yaml.FullLoader) data = data[0] port_s.append(data['Port']) query_p.append(data['QueryPort']) os.system("clear") amount_map = check_int("""Выберите карту из списка указав номер 1. The Island 2. The Center 3. Scorched Earth 4. Ragnarok 5. Aberration 6. Extinction 7. Valguero 8. Genesis: Part 1 9. Crystal Isles 10. Genesis: Part 2 11. Lost Island 12. Fjordur : """) if amount_map == 0: # 0 возрвращает check_int когда, ничего не было введено amount_map = i + 1 if 0: \n") if port_server == 0: if port_s == []: port_server = 7777 else: port_server = max(port_s) + 2 if port_server is port_s: # если веденный порт есть в списке портов print("Этот порт уже занят") else: break while True: query_port = check_int("Укажите Query-порт Сервера <27015>: \n") if query_port == 0: if query_p == []: query_port = 27015 else: query_port = max(query_p) + 2 if query_port is query_p: # если веденный порт есть в списке портов print("Этот порт уже занят") else: break password_server = input("Укажите пароль Сервера: \n") max_players = check_int("Укажите максимальное количество игроков: \n") if max_players == 0: max_players = 70 yaml_create(cluster_server, map_server, name_server, port_server, query_port, password_server, max_players, cluster_id, cluster_dir_override) def yaml_create(cluster_server, map_server, name_server, port_server, query_port, password_server, max_players, cluster_id, cluster_dir_override): settings_hlna = [ { 'Cluster' : cluster_server, 'SessionName' : name_server, 'Port' : port_server, 'QueryPort' : query_port, 'ServerPassword' : password_server, 'MaxPlayers' : max_players, 'ModsId' : mods_id, 'Listen' : listen_server, 'ServerPath' : dir_server } ] print(cluster_id) if cluster_id != None: settings_hlna[0]['clusterid'] = cluster_id settings_hlna[0]['clusterdir'] = cluster_dir_override with open(config_hlna + f"{map_server[-1]}", 'w') as yamlfile: data = yaml.dump(settings_hlna, yamlfile) print(colorama.Fore.GREEN + "Конфиг создан" + colorama.Style.RESET_ALL) @hlna.command() @click.option("-m", required=True, help="Название карты") @click.option("-e/-d", default=True, help="-e активировать карты, -d деактивировать") def enablemap(m,e): m = m.split(",") m = check_name_map(m, False) create_dir(config_hlna + "deactivated") if e == True: port_s = [] query_p = [] for k in list_config: with open(f"{home_dir}/.config/hlna/{k}", "r") as yamlfile: data = yaml.load(yamlfile, Loader=yaml.FullLoader) data = data[0] port_s.append(data['Port']) query_p.append(data['QueryPort']) for i in m: try: if i in list_config: print(f"Карта {i} уже есть в активных") continue with open(f"{home_dir}/.config/hlna/deactivated/{i}", "r") as yamlfile: data = yaml.load(yamlfile, Loader=yaml.FullLoader) data = data[0] if data['Port'] in port_s: print("Предлагаем заменить") if data['QueryPort'] in query_p: print("Заменить query port?") x = os.system(f"mv {config_hlna}deactivated/{i} {config_hlna + i} 2>> {config_hlna}logs") if x == 0: print(f"Карта активирована - {i}") else: print(f"{i} либо уже активирована, либо такой карты нет") except: print("ошибка") pass else: for i in m: try: if i in delist_config: print(f"Карта {i} уже есть в деактивированных") continue x = os.system(f"mv {config_hlna + i} {config_hlna}deactivated/{i} 2>> {config_hlna}logs") if x == 0: print(f"Карта деактивирована - {i}") else: print(f"{i} либо деактивирована, либо такой карты нет") except: pass @hlna.command() def servers(map_server=list_config): if map_server==[]: print("Сервера не установлены") else: for i in map_server: cluster_server, name_server, port_server, query_port, password_server, max_players, dir_server, mods_id, listen_server, cluster_id, cluster_dir_ovverride = read_yaml(i) x = os.system(f"lsof -w -i :{port_server}") if x == 0: print("Сервер запущен") else: print("Сервер не запущен") print(f""" Сервер: {i} Имя сервера: {name_server} Кластер: {cluster_server} Порт сервера: {port_server} Query порт: {query_port} Пароль: {password_server} Максимальное кол-во игроков: {max_players} Моды: {mods_id} Кластер id: {cluster_id}""") print("-" * 40) print("\n") @hlna.command(help='Для запуска, сконфигурированного сервера или кластера') @click.option('-m', default='all-E', help="Название карты для запуска или all для запуска все карт") def start(m, map_server=list_config): if map_server!=[]: if m == "all": print("запускаем ВСЕ карты") map_server += delist_config elif m == "all-E": print("Запускаем все активные карты") else: m = m.split(",") m = check_name_map(m) map_server = m else: print("Ни одной карты не установлено") for i in map_server: cluster_server, name_server, port_server, query_port, password_server, max_players, dir_server, mods_id, listen_server, cluster_id, cluster_dir_ovverride = read_yaml(i) create_dir(dir_server + i) print_line("Качаем карту: " + i) os.system(f"steamcmd +force_install_dir {dir_server + i} +login anonymous +app_update 376030 +quit") print_line("Карта скачана: " + i) def start(i): os.chdir(dir_server + i + "/ShooterGame/Binaries/Linux/") os.system(f"./ShooterGameServer {i}?SessionName={name_server}?Port={port_server}?QueryPort={query_port}?MaxPlayers={max_players}?GameModIds={mods_id}?listen={listen_server} -clusterid={cluster_id} -ClusterDirOverride={cluster_dir_ovverride}") if os.path.exists(dir_server + i + "ShooterGame/Binaries/Linux/"): threads = threading.Thread(target=start, args=(i,)) threads.start() else: print(f"Карта {i} не установлена") def read_yaml(map_server): with open(f"{home_dir}/.config/hlna/{map_server}", "r") as yamlfile: data = yaml.load(yamlfile, Loader=yaml.FullLoader) data = data[0] dir_server = data['ServerPath'] name_server = data['SessionName'] port_server = data['Port'] query_port = data['QueryPort'] password_server = data['ServerPassword'] max_players = data['MaxPlayers'] mods_id = data['ModsId'] listen_server = data['Listen'] cluster_server = data['Cluster'] cluster_id = data['clusterid'] cluster_dir_ovverride = data['clusterdir'] return cluster_server, name_server, port_server, query_port, password_server, max_players, dir_server, mods_id, listen_server, cluster_id, cluster_dir_ovverride def check_name_map(maps, flag=True): map_choise = [] for i in maps: if (i.lower() =="theisland" or i.lower() =="the island" or i.lower() =="island" or i.lower() =="остров" or i.lower() =="the_island"): map_choise.append("TheIsland") elif (i.lower() =="thecenter" or i.lower() =="the center" or i.lower() =="center" or i.lower() =="центр" or i.lower() =="the_center"): map_choise.append("TheCenter") elif (i.lower() =="scorchedearth_p" or i.lower() =="scorchedearth" or i.lower() =="scorched" or i.lower() =="scorch" or i.lower() =="выжженные" or i.lower() =="пустыня" or i.lower() =="scorched_earth" or i.lower() =="скорч"): map_choise.append("ScorchedEarth_P") elif (i.lower() =="ragnarok" or i.lower() =="рагнарек" or i.lower() =="рагнарёк" or i.lower() =="рагнарок"): map_choise.append("Ragnarok") elif (i.lower() =="aberration_p" or i.lower() =="aberration" or i.lower() =="aberation" or i.lower() =="аберация" or i.lower() =="аберрация" or i.lower() =="абберация" or i.lower() =="theaberration"): map_choise.append("Aberration_P") elif (i.lower() =="extinction" or i.lower() =="theextinction" or i.lower() =="вымирание" or i.lower() =="scorch" or i.lower() =="выжженные" or i.lower() =="пустыня"): map_choise.append("Extinction") elif (i.lower() =="valguero_p" or i.lower() =="valguero" or i.lower() =="thevalguero" or i.lower() =="валгуеро" or i.lower() =="валгуэро"): map_choise.append("Valguero_P") elif (i.lower() =="genesis" or i.lower() =="thegenesis" or i.lower() =="genesis1" or i.lower() =="gen" or i.lower() =="gen1" or i.lower() =="gen_1" or i.lower() =="gen-1" or i.lower() =="genesis_1" or i.lower() =="генезис"): map_choise.append("Genesis") elif (i.lower() =="crystalisles" or i.lower() =="crystal_isles" or i.lower() =="crystal" or i.lower() =="кристальныеострова" or i.lower() =="кристальные_острова" or i.lower() =="кристальные-острова" \ or i.lower() =="crystal-isles"): map_choise.append("CrystalIsles") elif (i.lower() =="gen2" or i.lower() =="gen_2" or i.lower() =="gen-2" or i.lower() =="genesis2" or i.lower() =="genesis_2" or i.lower() =="genesis-2" or i.lower() =="генезис2"): map_choise.append("Gen2") elif (i.lower() =="lostisland" or i.lower() =="lost_island" or i.lower() =="lost-island"): map_choise.append("LostIsland") elif (i.lower() =="fjordur" or i.lower() =="fjord" or i.lower() =="фьордур" or i.lower() =="фьорд") : map_choise.append("Fjordur") else: print("Карта-", i, "не распознана") continue if flag == True: if map_choise[-1] in list_config: print_line(f"{i} - Подготавливаем карту {map_choise[-1]}") else: map_choise.pop() print("Карта-", i, "не установлена") else: if map_choise[-1] in delist_config or map_choise[-1] in list_config: print_line(f"{i} - Подготавливаем карту {map_choise[-1]}") else: map_choise.pop() print("Карта -", i, "не установлена") return map_choise if __name__ == '__main__': hlna()