diff --git a/hlna.py b/hlna.py index 2fac1da..e93f11a 100755 --- a/hlna.py +++ b/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,38 +273,49 @@ 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 = [ - { - 'map': map_s, - 'Cluster': cluster_server, - 'SessionName': name_server, - 'Port': port_server, - 'QueryPort': query_port, - 'RCONEnabled': rcon_enabled, - 'RCONPort': rcon_port, - 'ServerAdminPassword': adminpassword_server, - 'ServerPassword': password_server, - 'MaxPlayers': max_players, - 'ModsId': mods_id, - '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) +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, + 'SessionName': name_server, + 'Port': port_server, + 'QueryPort': query_port, + 'RCONEnabled': rcon_enabled, + 'RCONPort': rcon_port, + 'ServerAdminPassword': adminpassword_server, + 'ServerPassword': password_server, + 'MaxPlayers': max_players, + 'ModsId': id_mods_ark, + 'Listen': listen_server, + 'ServerPath': dir_server_ark, + 'clusterid': cluster_id, + 'clusterdir': cluster_dir_override + } + ] + 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) - systemd_unit_create(game) - 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= [ModInstaller] ModIDS=" -# # 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) + 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()