From 61f653be2bad7956f9bc3426b7b3be15f3ac0432 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 4 Jun 2023 19:59:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BC=D1=83?= =?UTF-8?q?=D1=87=D0=B0=D0=BB=D1=81=D1=8F=20=D1=81=20=D0=B1=D1=8D=D0=BA?= =?UTF-8?q?=D0=B0=D0=BF=D0=B0=D0=BC=D0=B8))=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B2=D1=8B=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=20read=20yaml.=20=D0=97=D0=B0=D0=B5=D0=B1=D0=B0=D0=BB=D1=81?= =?UTF-8?q?=D1=8F!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 182 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 119 insertions(+), 63 deletions(-) diff --git a/hlna.py b/hlna.py index 7120e3f..bf485b2 100755 --- a/hlna.py +++ b/hlna.py @@ -39,7 +39,7 @@ 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) - +list_allconfigs = list_config + delist_config def create_dir(directory): """Проверка и создание директории""" @@ -72,13 +72,13 @@ def hlna(): def restore(g, m, d): """Получение пути к файлам внутри архива""" with tarfile.open(d, 'r') as tar_file: - files = tar_file.namelist() + files = tar_file.getnames() """Извлечение файлов""" for i in files: with tar_file.extract(d, 'r:gz') as tar_file: path_extarct = "./" if g == 'test' else "/" tar_file.extract(i, path_extarct) - print(i, colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL) + print_line(f"i - перемещен", flag="GREEN") print_line(f"Бэкап {d} восстановлен", flag="GREEN") @@ -87,12 +87,16 @@ def restore(g, m, d): @click.option('-m', default='all', help="Название карты для запуска или all для запуска всех карт") def backup(g, m): if g == "ark" or g == "ark_test": - name_server = choose_map(g, m) + name_servers = choose_map(g, m) + config_backup(g, m) backup_path = f"{dir_server_ark}Backups" if g == "ark" else f"{dir_server_ark}Backups/test_backup" if not backup_path: backup_path = f"{dir_server_ark}Backups" - for i in name_server: - source = [f"{dir_maps_ark}"] + for i in name_servers: + data = read_yaml(g="ark", m=i) + map = data['map'] + str(map) + source = [f"{dir_maps_ark}", f"{dir_ark_save}"] target = f"{backup_path}/{g}_{i}_backup_{time.strftime('%Y_%m_%d')}.tar" create_dir(backup_path) with tarfile.open(target, 'w') as mytar: @@ -100,17 +104,17 @@ def backup(g, m): for root, dirs, files in os.walk(source_folder): for file in files: name, ext = os.path.splitext(file) - if ext == i: - path = os.path.join(root, name) + if ext == '.arkprofile' or name.startswith(map): + path = os.path.join(root, file) mytar.add(path) - print(path, colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL) + print_line(f"{path} - сохранён", flag="GREEN") print_line(f"Конфиги сохранены в {target}", flag="GREEN") elif g == "7days": pass else: print("Поддерживает только ark и 7days") - - + + def unpack(src, dst): """Добавить документацию""" with open(src, 'rb') as f: @@ -175,7 +179,7 @@ def unpack(src, dst): else: msg = "The signature and format version is incorrect. Signature was {} should be 2653586369.".format(sigver) logging.critical(msg) - return print_line(msg,flag="RED") + return print_line(msg, flag="RED") # Write the extracted data to disk with open(dst, 'wb') as f: @@ -202,7 +206,7 @@ def print_line(*text, flag="", sep=" ", end="\n"): color = colorama.Fore.WHITE len_text = str(*text) len_text = len_text.split("\n") - max_length = max(len(string) for string in len_text)+2 + max_length = max(len(string) for string in len_text) + 2 print(color + "." * max_length) print(color, *text, sep=sep, end=end) print(color + "." * max_length + colorama.Style.RESET_ALL) @@ -222,14 +226,15 @@ def check_int(number=""): @hlna.command(help='Выбор игры и сбор настроек для сервера(-ов)') -def config(): - count_game = check_int("""Выберите игру для конфигурирования - 1. ARK Survival Evolved - 2. 7 Days to Die - : """) - if count_game == 1: - config_ark() - elif count_game == 2: +@click.argument('g', nargs=1) +@click.option('-b', required=False, default=False, help="Конфигурация бэкапов игры") +def config(g, b): + if g == "ark": + if b: + config_backup(g) + else: + config_ark() + elif g == "7days": config_7daystodie() else: print_line("Пока есть только ARK и 7Days xD", flag="YELLOW") @@ -240,7 +245,7 @@ def ports_array(): query_p = [] rcon_p = [] for k in list_config: - data_port = read_yaml(k, g="ark") + data_port = read_yaml(g="ark", m=k) port_s.append(data_port['Port']) query_p.append(data_port['QueryPort']) rcon_p.append(data_port['RCONPort']) @@ -370,7 +375,6 @@ def config_nameserver(map_s): list_config.append(map_s) break else: - list_allconfigs = list_config + delist_config if name_server in list_allconfigs: choose_reconf = input("""Сервер существует. Перенастроить? (по умолчанию) нет 1. Да @@ -450,7 +454,7 @@ def config_ark(list_config=list_config): if list_config: print_line("Уже установленные карты: ", flag="CYAN") for i in list_config: - data = read_yaml(i, g="ark") + data = read_yaml(g="ark", m=i) print_line(f"Карта - {i} : Имя сервера {data['SessionName']}", flag="CYAN") count_maps = config_nummap() for i in range(count_maps): @@ -486,11 +490,62 @@ def config_7daystodie(): systemd_unit_create("7Days", config_7days) +@hlna.command(help='Удаление конфигурации сервера') +@click.argument('g', nargs=1) +@click.option('-m', default='all', help="Название карты для запуска или all для запуска всех карт") +def config_backup(g, m): + if g == "ark": + name_server = choose_map(g, m) + if m == "all": + print_line(f"М: {m}, name_server: {name_server}") + all_empty = True # флаг + for i in name_server: + print_line(f"{i},{g}") + data = read_yaml(g, m=i, flag=True) + if 'ark_backup' not in data or data['ark_backup'] == "" or data['ark_backup'] == "False": + all_empty = False # меняем флаг, если есть значение, которое не пустое + if all_empty: + config_backup_settings(g="ark") # если все значения пустые, то вызываем config_backup_settings + else: + pass # Тут должна быть проверка на то в каких серверах есть настройки резервного копирования, а в каких нет + вывод этой информации + # print_line("Уже настроен для карт: ", flag="CYAN")% + # name_servers = choose_map(g, m) + # print_line(name_servers) + # for i in name_servers: + # data = read_yaml(g="ark", i) + # print_line(f"Карта - {i} : Имя сервера {data['SessionName']}", flag="CYAN") + # choose_reconf = input("""Перенастроить? (по умолчанию) нет + # 1. Да + # 2. Нет + # :""") + # if choose_reconf == "" or "2": + # pass + # elif choose_reconf == "1": + # config_backup_settings(g) + # else: + # return config_backup(g) + # elif g == "7days": + # print_line("Пока не работает") + + +def config_backup_settings(g): + print_line(f"Входим в config_backup_settings - {g}") + if g == "ark": + + data = read_yaml(g) + elif g == "7days": + print_line("Пока не работает") + def xml_parser(): """добавить документацию""" print_line("Я пока не умею парсить xml))", flag="RED") +def ini_parser(): + """добавить документацию""" + print_line("Я пока не умею парсить ini))", flag="RED") + + def yaml_create(g, 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=""): @@ -536,7 +591,7 @@ def systemd_unit_create(g, name_server=list_config, config_7days=""): g = g.lower() if g == "ark": id_game = "376030" - data = read_yaml(name_server, g="ark") + data = read_yaml(g="ark", m=name_server) ntff = "" if not data['Cluster'] else "-NoTransferFromFiltering" unit_dir_server = dir_server_ark dir_server_exec = f"{dir_server_ark}ShooterGame/Binaries/Linux/" @@ -588,7 +643,7 @@ def remove(g, m): @click.argument('g', nargs=1) @click.option('-m', default='all', help="Название карты для запуска или all для запуска всех карт") @click.option("-i/-u", default=True, help="-i установить/обновить моды, -u удалить моды") -@click.argument('id_mods_ark',required=True, nargs=-1) +@click.argument('id_mods_ark', required=True, nargs=-1) def mod(g, m, i, id_mods_ark): g = g.lower() if g == "ark": @@ -599,7 +654,7 @@ def mod(g, m, i, id_mods_ark): id_mods = "" for id_mod in id_mods_ark: - id_mods += ","+id_mod + id_mods += "," + id_mod dir_mod_ark = f"{dir_mods_ark}/{id_mod}" if not os.path.isfile(f"{dir_mod_ark}.mod"): @@ -618,8 +673,9 @@ def mod(g, m, i, id_mods_ark): id_mods = id_mods[1:] id_mods_ark = id_mods for i in name_server: - data = read_yaml(i, g="ark") - yaml_create("ark", data['ServerPath'], data['Cluster'], data['map'], data['SessionName'], data['Port'], data['QueryPort'], + data = read_yaml(g="ark", m=i) + yaml_create("ark", data['ServerPath'], data['Cluster'], data['map'], data['SessionName'], data['Port'], + data['QueryPort'], data['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], data['ServerPassword'], data['MaxPlayers'], id_mods_ark, data['clusterid'], data['clusterdir'], data['Listen']) else: @@ -664,7 +720,7 @@ def modupdateall(g, m): print_line("Проверяем обновление всех установленных модов", flag="CYAN") if not os.path.isdir(dir_mods_ark): create_dir(dir_mods_ark) - for file in os.listdir(dir_mods_ark): # Поменять на чтение списка модов из yaml + for file in os.listdir(dir_mods_ark): # Поменять на чтение списка модов из yaml if os.path.isfile(os.path.join(dir_mods_ark, file)): if file.endswith('.mod'): id_mod = file.split(".")[0] @@ -685,7 +741,8 @@ def moddownload(g, m, id_mod, dir_mod_ark): return if os.path.isfile(f"{dir_workshop_ark}/appworkshop_{id_game_workshop}.acf"): os.system(f"rm {dir_workshop_ark}/appworkshop_{id_game_workshop}.acf") - os.system(f"steamcmd +force_install_dir {home_dir}/.local/share/Steam/ +login anonymous +workshop_download_item {id_game_workshop} {id_mod} +quit") + os.system( + f"steamcmd +force_install_dir {home_dir}/.local/share/Steam/ +login anonymous +workshop_download_item {id_game_workshop} {id_mod} +quit") try: for curdir, subdirs, files in os.walk(os.path.join(dir_steam_workshop)): for file in files: @@ -742,17 +799,17 @@ def moddownload(g, m, id_mod, dir_mod_ark): else: with open(f"{dir_mods_ark}.mod", "wb") as f_out: f_out.write(b'\x01\x00\x00\x00\x08\x00\x00\x00ModType\x00\x02\x00\x00\x001\x00') - x = os.system(f"mv {dir_workshop_ark}/appworkshop_{id_game_workshop}.acf {dir_mod_ark}/appworkshop_{id_game_workshop}.acf") + x = os.system( + f"mv {dir_workshop_ark}/appworkshop_{id_game_workshop}.acf {dir_mod_ark}/appworkshop_{id_game_workshop}.acf") @hlna.command(help='Выключение/включение серверов (без удаления) > {dir_logs}{date} 2>&1") with open(f"{dir_logs}{date}.log", "a") as f: - f.write(f"[{t}] Сервер {i} перемещён из {state_msg}\n")# переписать эту залупу + f.write(f"[{t}] Сервер {i} перемещён из {state_msg}\n") # переписать эту залупу else: - print_line("Вход в отключение", flag="RED") x = os.system(f"mv {dir_maps_ark}{i} {dir_deactivated} >> {dir_logs}{date} 2>&1") with open(f"{dir_logs}{date}.log", "a") as f: f.write(f"[{t}] Сервер {i} перемещён из {state_msg}\n") if x == 0: - #start = "start" if e else "stop" + # start = "start" if e else "stop" enable = "enable" if e else "disable" os.system(f"systemctl --user {enable} ark_{i.lower()}") print_line(f"Выполнено для сервера- {i}", flag="GREEN") @@ -806,7 +862,7 @@ def status(list_config=list_config): print_line("Сервера не сконфигурированы", flag="RED") else: for i in list_config: - data = read_yaml(i, g="ark") + data = read_yaml(g="ark", m=i) x = os.system(f"lsof -w -i :{data['Port']}") if x == 0: print_line("Сервер запущен", flag="GREEN") @@ -833,7 +889,7 @@ def status(list_config=list_config): x = input("Есть неактивные сервера, показать Y/n: ") if x != "n": for i in delist_config: - data = read_yaml(i, False) + data = read_yaml(i, flag=False) print_line(f""" Имя сервера: {i} Карта: {data['map']} @@ -848,8 +904,8 @@ def status(list_config=list_config): Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="YELLOW") -@hlna.command(help='Запуск, сконфигурированного сервера или кластера ') -@click.option('-g', required=True, help="Название игры для запуска. (ark, 7days") +@hlna.command(help='Запуск, сконфигурированного сервера или кластера ') +@click.argument('g', nargs=1) @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def start(g, m): """Запускает сервер выбранной игры""" @@ -861,8 +917,8 @@ def start(g, m): start_stop("start", g, m) -@hlna.command(help='Остановка, сконфигурированного сервера или кластера ') -@click.option('-g', required=True, help="Название игры для запуска. (ark, 7days") +@hlna.command(help='Остановка, сконфигурированного сервера или кластера ') +@click.argument('g', nargs=1) @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def stop(g, m): g = g.lower() @@ -871,8 +927,8 @@ def stop(g, m): start_stop("stop", g, m) -@hlna.command(help='Перезапуск, сконфигурированного сервера или кластера ') -@click.option('-g', required=True, help="Название игры для запуска. (ark, 7days") +@hlna.command(help='Перезапуск, сконфигурированного сервера или кластера ') +@click.argument('g', nargs=1) @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def restart(g, m): g = g.lower() @@ -897,10 +953,10 @@ def start_stop(action, g, m): g = g.lower() if g == "ark": x = check_exist_servers(g) - if x: - name_servers = choose_map(g,m) if m !='all' else list_config + if x: + name_servers = choose_map(g, m) if m != 'all' else list_config for i in name_servers: - data = read_yaml(i, g="ark", flag=True) + data = read_yaml(g="ark", m=i, flag=True) if action == "stop" or action == "restart": rcon_local(i, "SaveWorld") x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") @@ -915,20 +971,18 @@ def start_stop(action, g, m): print_line("доступные игры: ark и 7days") -def read_yaml(list_config=list_config, flag=True, m="", g=""): +def read_yaml(g="", m="", flag=True): """Читает конфиги активных или неактивных карт в зависимости от флага и отдаёт данные туда где их запросили""" - print_line("Вход в read_yaml", flag="RED") g = g.lower() + print_line(f"g: {g}, m: {m}") if g == "ark": - print_line("Вход в арк в чтении", flag="RED") if m == "all": - list_config=list_config - path_yaml = f"{dir_maps_ark}{list_config}" if flag else f"{dir_deactivated}{list_config}" + print_line("Не правильный вызов yaml, должен вызываться из цикла") + path_yaml = f"{dir_maps_ark}{m}" if flag else f"{dir_deactivated}{m}" elif g == "path_server": path_yaml = dir_config + "config" with open(path_yaml, "r") as yamlfile: data = yaml.load(yamlfile, Loader=yaml.FullLoader) - print_line("Выход из read_yaml", flag="RED") return data[0] # возвращаем словарь со всеми значениями @@ -939,8 +993,9 @@ def choose_map(g, m, list_config=list_config): if g == "ark": dict_mapname = {} dict_allmapname = [] + print_line(list_config) for i in list_config: - data = read_yaml(i, g="ark") + data = read_yaml(g="ark", m=i) dict_mapname[data['SessionName']] = data['map'] dict_allmapname.append(data['SessionName']) name_servers = [] @@ -950,7 +1005,7 @@ def choose_map(g, m, list_config=list_config): if list_config != []: # Перенести выше для проверки наличия конфигов if m == "all": new_arr = dict_allmapname - print_line(f"Выполняется для карт(-ы) {name_servers}", flag="CYAN") + print_line(f"Выполняется для карт(-ы) {new_arr}", flag="CYAN") else: if name_servers: name_servers = sorted(name_servers) @@ -990,7 +1045,7 @@ def rcon_local(m, c): if list_config: rcon_ports = [] for i in list_config: - data = read_yaml(i, g="ark") + data = read_yaml(g="ark", m=i) dict_mapname[data['RCONPort']] = data['map'] dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] if m == "all": @@ -1030,6 +1085,7 @@ dir_unit = f"{home_dir}/.config/systemd/user/" dir_logs = f"{dir_config}logs/" dir_server_ark = f"{dir_server}ARK/" +dir_ark_save = f"{dir_server_ark}ShooterGame/Saved/SavedArks/" dir_workshop_ark = f"{home_dir}/.local/share/Steam/steamapps/workshop" dir_shooter = "ShooterGame" dir_mods_ark = f"{dir_server_ark}ShooterGame/Content/Mods"