From ebc38b6a07aafd336aa69ddac51f1a44e5f57a15 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sat, 27 May 2023 17:22:06 +0300 Subject: [PATCH 01/71] gui --- hlna.py | 16 +++++++++++++--- hlnaui.py | 8 ++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/hlna.py b/hlna.py index 55eff5a..9092624 100755 --- a/hlna.py +++ b/hlna.py @@ -3,6 +3,7 @@ import os import re import sys import zlib +import signal import struct import logging import datetime @@ -516,6 +517,7 @@ def mod(g, m, i, id_mods_ark): dir_mod_ark = f"{dir_mods_ark}/{id_mod}" if not os.path.isfile(f"{dir_mod_ark}.mod"): if i: + print_line(f"Скачиваем мод {id_mod}") moddownload(g, m, id_mod, dir_mod_ark) else: os.system(f"rm -rf {dir_mod_ark}") @@ -922,11 +924,19 @@ class HlnaApp(QtWidgets.QMainWindow, hlnaui.Ui_mainWindow): def __init__(self): super().__init__() self.setupUi(self) - self.lineEdit_namesession.returnPressed.connect(self.printable) - def printable(self): - namesession = self.lineEdit_namesession.text() + def addNewTab(self): + newTab = QtWidgets.QWidget() + oldTab = self.tab_ark_map.widget(0) + oldTabLayout = oldTab.layout() + newTab.setLayout(oldTabLayout) + self.tab_ark_map.addTab(newTab, "Tab " + str(self.tab_ark_map.count() + 1)) + self.tab_ark_map.setCurrentIndex(self.tab_ark_map.count() - 1) + + + + diff --git a/hlnaui.py b/hlnaui.py index a16934f..bdaf890 100644 --- a/hlnaui.py +++ b/hlnaui.py @@ -250,14 +250,14 @@ class Ui_mainWindow(object): self.tab_gameini.setObjectName("tab_gameini") self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_gameini) self.gridLayout_4.setObjectName("gridLayout_4") - self.tableView = QtWidgets.QTableView(parent=self.tab_gameini) + self.kdialog = QtWidgets.QDialog(parent=self.tab_gameini) + self.kdialog.setObjectName("kdialog") + self.tableView = QtWidgets.QTableView(parent=self.kdialog) + self.tableView.setGeometry(QtCore.QRect(0, 0, 941, 862)) self.tableView.setGridStyle(QtCore.Qt.PenStyle.SolidLine) self.tableView.setObjectName("tableView") self.tableView.horizontalHeader().setVisible(True) self.tableView.horizontalHeader().setCascadingSectionResizes(False) - self.gridLayout_4.addWidget(self.tableView, 0, 1, 1, 1) - self.kdialog = QtWidgets.QDialog(parent=self.tab_gameini) - self.kdialog.setObjectName("kdialog") self.gridLayout_4.addWidget(self.kdialog, 0, 0, 1, 1) self.tabWidget_ini.addTab(self.tab_gameini, "") self.tab_gameusersettingsini = QtWidgets.QWidget() From a2150f8ad1c7735ba1f010d356b43ac63c945072 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sat, 27 May 2023 19:57:10 +0300 Subject: [PATCH 02/71] gui --- hlna.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/hlna.py b/hlna.py index 9092624..fe573cb 100755 --- a/hlna.py +++ b/hlna.py @@ -3,7 +3,6 @@ import os import re import sys import zlib -import signal import struct import logging import datetime @@ -926,20 +925,6 @@ class HlnaApp(QtWidgets.QMainWindow, hlnaui.Ui_mainWindow): self.setupUi(self) - def addNewTab(self): - newTab = QtWidgets.QWidget() - oldTab = self.tab_ark_map.widget(0) - oldTabLayout = oldTab.layout() - newTab.setLayout(oldTabLayout) - self.tab_ark_map.addTab(newTab, "Tab " + str(self.tab_ark_map.count() + 1)) - self.tab_ark_map.setCurrentIndex(self.tab_ark_map.count() - 1) - - - - - - - def hlnag(): if len(sys.argv) > 1: hlna() From 71963db0dffac487a223242cdb3058df93aa7536 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sat, 27 May 2023 20:31:41 +0300 Subject: [PATCH 03/71] =?UTF-8?q?=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index fe573cb..0f4a6b0 100755 --- a/hlna.py +++ b/hlna.py @@ -338,7 +338,7 @@ def config_password(): def config_adminpassword(): - adminpassword_server = input("Укажите пароль Сервера: \n") + adminpassword_server = input("Укажите пароль администратора сервера: \n") return adminpassword_server From 0c1727433f490f0e88f7abb02eea8833fbed2874 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sat, 27 May 2023 21:09:08 +0300 Subject: [PATCH 04/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 0f4a6b0..058a777 100755 --- a/hlna.py +++ b/hlna.py @@ -468,7 +468,7 @@ def systemd_unit_create(game, config_7days="", name_server=list_config): 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']}?GameModIds=2112724006?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}" unit_file = f"{dir_unit}ark_{data['SessionName']}.service".lower() elif game == "7Days": id_game = "294420" From c45adb7d2e88a64c7946c75c405d898cf4c713e2 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sat, 27 May 2023 21:22:57 +0300 Subject: [PATCH 05/71] ports --- hlna.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hlna.py b/hlna.py index 058a777..ab250cf 100755 --- a/hlna.py +++ b/hlna.py @@ -316,19 +316,19 @@ def config_nameserver(map_s): def config_ports(port_s): port = check_int("Укажите порт сервера: ") - port_server = ports(port, port_s, True) + port_server = ports(port, port_s, 0) return port_server def config_query(query_p): port = check_int("Укажите query порт сервера: ") - query_port = ports(port, query_p, False) + query_port = ports(port, query_p, 1) return query_port def config_rcon(rcon_p): port = check_int("Укажите порт сервера: ") - rcon_port = ports(port, rcon_p, True) + rcon_port = ports(port, rcon_p, 2) return rcon_port From f8624f741f4a339f7c2608a56a3c2d682821138c Mon Sep 17 00:00:00 2001 From: xpamych Date: Sat, 27 May 2023 23:32:09 +0300 Subject: [PATCH 06/71] =?UTF-8?q?=D0=B5=D1=89=D1=91=20=D0=BC=D0=B0=D0=BB?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 4 +- hlnaui.py | 383 ++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 316 insertions(+), 71 deletions(-) diff --git a/hlna.py b/hlna.py index ab250cf..5084153 100755 --- a/hlna.py +++ b/hlna.py @@ -192,10 +192,11 @@ def ports(port, ports_arr, flag): port = 27015 elif flag == 2: port = 27044 - print("Port=", port) + print_line("Port=", port) return port else: port = max(ports_arr) + 2 + print_line("Port=", port) if port in ports_arr: print("Порт уже занят") else: @@ -308,6 +309,7 @@ def config_nameserver(map_s): else: if name_server in list_config: print_line("Имя занято", flag=False) + config_nameserver(map_s) else: list_config.append(name_server) # если enter, то ставим последним элементом карту break diff --git a/hlnaui.py b/hlnaui.py index bdaf890..c4aa63d 100644 --- a/hlnaui.py +++ b/hlnaui.py @@ -28,6 +28,7 @@ class Ui_mainWindow(object): self.gridLayout_2 = QtWidgets.QGridLayout(self.tabArk) self.gridLayout_2.setObjectName("gridLayout_2") self.tabServers = QtWidgets.QTabWidget(parent=self.tabArk) + self.tabServers.setEnabled(True) self.tabServers.setTabletTracking(False) self.tabServers.setFocusPolicy(QtCore.Qt.FocusPolicy.TabFocus) self.tabServers.setTabPosition(QtWidgets.QTabWidget.TabPosition.North) @@ -40,8 +41,8 @@ class Ui_mainWindow(object): self.tabServers.setObjectName("tabServers") self.tab_5 = QtWidgets.QWidget() self.tab_5.setObjectName("tab_5") - self.horizontalLayout = QtWidgets.QHBoxLayout(self.tab_5) - self.horizontalLayout.setObjectName("horizontalLayout") + self.gridLayout = QtWidgets.QGridLayout(self.tab_5) + self.gridLayout.setObjectName("gridLayout") self.groupBox = QtWidgets.QGroupBox(parent=self.tab_5) self.groupBox.setMinimumSize(QtCore.QSize(500, 800)) self.groupBox.setMaximumSize(QtCore.QSize(500, 16777215)) @@ -169,7 +170,7 @@ class Ui_mainWindow(object): self.verticalLayout_3.addWidget(self.label_players) self.lineEdit_players = QtWidgets.QLineEdit(parent=self.groupBox_settings) self.lineEdit_players.setMinimumSize(QtCore.QSize(0, 35)) - self.lineEdit_players.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_players.setMaximumSize(QtCore.QSize(65, 35)) self.lineEdit_players.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal) self.lineEdit_players.setClearButtonEnabled(True) self.lineEdit_players.setObjectName("lineEdit_players") @@ -230,12 +231,7 @@ class Ui_mainWindow(object): self.label_rconcmd.setScaledContents(True) self.label_rconcmd.setObjectName("label_rconcmd") self.verticalLayout_2.addWidget(self.groupBox_6) - self.horizontalLayout.addWidget(self.groupBox) - self.line_7 = QtWidgets.QFrame(parent=self.tab_5) - self.line_7.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_7.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.line_7.setObjectName("line_7") - self.horizontalLayout.addWidget(self.line_7) + self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1) self.scrollArea = QtWidgets.QScrollArea(parent=self.tab_5) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") @@ -273,61 +269,270 @@ class Ui_mainWindow(object): self.tabWidget_ini.addTab(self.tab_gameusersettingsini, "") self.gridLayout_3.addWidget(self.tabWidget_ini, 0, 0, 1, 1) self.scrollArea.setWidget(self.scrollAreaWidgetContents) - self.horizontalLayout.addWidget(self.scrollArea) + self.gridLayout.addWidget(self.scrollArea, 0, 4, 1, 1) + self.line_7 = QtWidgets.QFrame(parent=self.tab_5) + self.line_7.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_7.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_7.setObjectName("line_7") + self.gridLayout.addWidget(self.line_7, 0, 1, 1, 1) self.tabServers.addTab(self.tab_5, "") - self.tab = QtWidgets.QWidget() - self.tab.setObjectName("tab") - self.tabServers.addTab(self.tab, "") self.gridLayout_2.addWidget(self.tabServers, 0, 0, 1, 1) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap("./../../Yandex.Disk/Изображения/Оформление/ARK-2-Logo.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabGames.addTab(self.tabArk, icon1, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") - self.gridLayout = QtWidgets.QGridLayout(self.tab_2) - self.gridLayout.setObjectName("gridLayout") - self.groupBox_4 = QtWidgets.QGroupBox(parent=self.tab_2) - self.groupBox_4.setObjectName("groupBox_4") - self.gridLayout.addWidget(self.groupBox_4, 0, 1, 1, 1) - self.groupBox_3 = QtWidgets.QGroupBox(parent=self.tab_2) - self.groupBox_3.setTitle("") - self.groupBox_3.setObjectName("groupBox_3") - self.label_8 = QtWidgets.QLabel(parent=self.groupBox_3) - self.label_8.setGeometry(QtCore.QRect(10, 10, 81, 18)) - self.label_8.setScaledContents(True) - self.label_8.setObjectName("label_8") - self.textEdit_9 = QtWidgets.QTextEdit(parent=self.groupBox_3) - self.textEdit_9.setGeometry(QtCore.QRect(10, 80, 131, 31)) - self.textEdit_9.setObjectName("textEdit_9") - self.label_9 = QtWidgets.QLabel(parent=self.groupBox_3) - self.label_9.setGeometry(QtCore.QRect(10, 60, 81, 18)) - self.label_9.setScaledContents(True) - self.label_9.setObjectName("label_9") - self.textEdit_12 = QtWidgets.QTextEdit(parent=self.groupBox_3) - self.textEdit_12.setGeometry(QtCore.QRect(10, 140, 221, 31)) - self.textEdit_12.setObjectName("textEdit_12") - self.label_12 = QtWidgets.QLabel(parent=self.groupBox_3) - self.label_12.setGeometry(QtCore.QRect(10, 120, 101, 18)) - self.label_12.setScaledContents(True) - self.label_12.setObjectName("label_12") - self.label_13 = QtWidgets.QLabel(parent=self.groupBox_3) - self.label_13.setGeometry(QtCore.QRect(240, 120, 161, 18)) - self.label_13.setScaledContents(True) - self.label_13.setObjectName("label_13") - self.textEdit_13 = QtWidgets.QTextEdit(parent=self.groupBox_3) - self.textEdit_13.setGeometry(QtCore.QRect(230, 140, 221, 31)) - self.textEdit_13.setObjectName("textEdit_13") - self.textEdit_14 = QtWidgets.QTextEdit(parent=self.groupBox_3) - self.textEdit_14.setGeometry(QtCore.QRect(10, 200, 71, 31)) - self.textEdit_14.setObjectName("textEdit_14") - self.label_14 = QtWidgets.QLabel(parent=self.groupBox_3) - self.label_14.setGeometry(QtCore.QRect(10, 180, 131, 18)) - self.label_14.setScaledContents(True) - self.label_14.setObjectName("label_14") - self.lineEdit = QtWidgets.QLineEdit(parent=self.groupBox_3) - self.lineEdit.setGeometry(QtCore.QRect(10, 30, 441, 32)) - self.lineEdit.setObjectName("lineEdit") - self.gridLayout.addWidget(self.groupBox_3, 0, 0, 1, 1) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.tab_2) + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.tabServers_2 = QtWidgets.QTabWidget(parent=self.tab_2) + self.tabServers_2.setTabletTracking(False) + self.tabServers_2.setFocusPolicy(QtCore.Qt.FocusPolicy.TabFocus) + self.tabServers_2.setTabPosition(QtWidgets.QTabWidget.TabPosition.North) + self.tabServers_2.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) + self.tabServers_2.setElideMode(QtCore.Qt.TextElideMode.ElideNone) + self.tabServers_2.setDocumentMode(False) + self.tabServers_2.setTabsClosable(True) + self.tabServers_2.setMovable(True) + self.tabServers_2.setTabBarAutoHide(False) + self.tabServers_2.setObjectName("tabServers_2") + self.tab_6 = QtWidgets.QWidget() + self.tab_6.setObjectName("tab_6") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.tab_6) + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.groupBox_2 = QtWidgets.QGroupBox(parent=self.tab_6) + self.groupBox_2.setMinimumSize(QtCore.QSize(500, 800)) + self.groupBox_2.setMaximumSize(QtCore.QSize(500, 16777215)) + self.groupBox_2.setTitle("") + self.groupBox_2.setFlat(False) + self.groupBox_2.setObjectName("groupBox_2") + self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.groupBox_2) + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.groupBox_settings_2 = QtWidgets.QGroupBox(parent=self.groupBox_2) + self.groupBox_settings_2.setMinimumSize(QtCore.QSize(0, 600)) + self.groupBox_settings_2.setMaximumSize(QtCore.QSize(500, 16777215)) + self.groupBox_settings_2.setObjectName("groupBox_settings_2") + self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_settings_2) + self.verticalLayout_5.setObjectName("verticalLayout_5") + self.checkBox_cluster_2 = QtWidgets.QCheckBox(parent=self.groupBox_settings_2) + self.checkBox_cluster_2.setObjectName("checkBox_cluster_2") + self.verticalLayout_5.addWidget(self.checkBox_cluster_2) + self.lineEdit_cluster_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_cluster_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_cluster_2.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_cluster_2.setClearButtonEnabled(True) + self.lineEdit_cluster_2.setObjectName("lineEdit_cluster_2") + self.verticalLayout_5.addWidget(self.lineEdit_cluster_2) + self.checkBox_listen_2 = QtWidgets.QCheckBox(parent=self.groupBox_settings_2) + self.checkBox_listen_2.setObjectName("checkBox_listen_2") + self.verticalLayout_5.addWidget(self.checkBox_listen_2) + self.label_namesession_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_namesession_2.setMinimumSize(QtCore.QSize(0, 10)) + self.label_namesession_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_namesession_2.setScaledContents(True) + self.label_namesession_2.setObjectName("label_namesession_2") + self.verticalLayout_5.addWidget(self.label_namesession_2) + self.lineEdit_namesession_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_namesession_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_namesession_2.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_namesession_2.setClearButtonEnabled(True) + self.lineEdit_namesession_2.setObjectName("lineEdit_namesession_2") + self.verticalLayout_5.addWidget(self.lineEdit_namesession_2) + self.line_8 = QtWidgets.QFrame(parent=self.groupBox_settings_2) + self.line_8.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_8.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_8.setObjectName("line_8") + self.verticalLayout_5.addWidget(self.line_8) + self.label_port_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_port_2.setMinimumSize(QtCore.QSize(0, 10)) + self.label_port_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_port_2.setScaledContents(True) + self.label_port_2.setObjectName("label_port_2") + self.verticalLayout_5.addWidget(self.label_port_2) + self.lineEdit_port_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_port_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_port_2.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_port_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal) + self.lineEdit_port_2.setClearButtonEnabled(True) + self.lineEdit_port_2.setObjectName("lineEdit_port_2") + self.verticalLayout_5.addWidget(self.lineEdit_port_2) + self.label_querryport_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_querryport_2.setMinimumSize(QtCore.QSize(0, 15)) + self.label_querryport_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_querryport_2.setScaledContents(True) + self.label_querryport_2.setObjectName("label_querryport_2") + self.verticalLayout_5.addWidget(self.label_querryport_2) + self.lineEdit_querryport_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_querryport_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_querryport_2.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_querryport_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal) + self.lineEdit_querryport_2.setClearButtonEnabled(True) + self.lineEdit_querryport_2.setObjectName("lineEdit_querryport_2") + self.verticalLayout_5.addWidget(self.lineEdit_querryport_2) + self.label_rconport_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_rconport_2.setMinimumSize(QtCore.QSize(0, 15)) + self.label_rconport_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_rconport_2.setScaledContents(True) + self.label_rconport_2.setObjectName("label_rconport_2") + self.verticalLayout_5.addWidget(self.label_rconport_2) + self.lineEdit_rconport_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_rconport_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_rconport_2.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_rconport_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal) + self.lineEdit_rconport_2.setClearButtonEnabled(True) + self.lineEdit_rconport_2.setObjectName("lineEdit_rconport_2") + self.verticalLayout_5.addWidget(self.lineEdit_rconport_2) + self.line_2 = QtWidgets.QFrame(parent=self.groupBox_settings_2) + self.line_2.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_2.setObjectName("line_2") + self.verticalLayout_5.addWidget(self.line_2) + self.label_adminpassword_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_adminpassword_2.setMinimumSize(QtCore.QSize(0, 15)) + self.label_adminpassword_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_adminpassword_2.setScaledContents(True) + self.label_adminpassword_2.setObjectName("label_adminpassword_2") + self.verticalLayout_5.addWidget(self.label_adminpassword_2) + self.lineEdit_adminpassword_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_adminpassword_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_adminpassword_2.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_adminpassword_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.PasswordEchoOnEdit) + self.lineEdit_adminpassword_2.setPlaceholderText("") + self.lineEdit_adminpassword_2.setClearButtonEnabled(True) + self.lineEdit_adminpassword_2.setObjectName("lineEdit_adminpassword_2") + self.verticalLayout_5.addWidget(self.lineEdit_adminpassword_2) + self.label_password_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_password_2.setMinimumSize(QtCore.QSize(0, 15)) + self.label_password_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_password_2.setScaledContents(True) + self.label_password_2.setObjectName("label_password_2") + self.verticalLayout_5.addWidget(self.label_password_2) + self.lineEdit_password_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_password_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_password_2.setMaximumSize(QtCore.QSize(16777215, 35)) + self.lineEdit_password_2.setText("") + self.lineEdit_password_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.PasswordEchoOnEdit) + self.lineEdit_password_2.setObjectName("lineEdit_password_2") + self.verticalLayout_5.addWidget(self.lineEdit_password_2) + self.line_9 = QtWidgets.QFrame(parent=self.groupBox_settings_2) + self.line_9.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_9.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_9.setObjectName("line_9") + self.verticalLayout_5.addWidget(self.line_9) + self.label_players_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_players_2.setMinimumSize(QtCore.QSize(0, 15)) + self.label_players_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_players_2.setScaledContents(True) + self.label_players_2.setObjectName("label_players_2") + self.verticalLayout_5.addWidget(self.label_players_2) + self.lineEdit_players_2 = QtWidgets.QLineEdit(parent=self.groupBox_settings_2) + self.lineEdit_players_2.setMinimumSize(QtCore.QSize(0, 35)) + self.lineEdit_players_2.setMaximumSize(QtCore.QSize(65, 35)) + self.lineEdit_players_2.setEchoMode(QtWidgets.QLineEdit.EchoMode.Normal) + self.lineEdit_players_2.setClearButtonEnabled(True) + self.lineEdit_players_2.setObjectName("lineEdit_players_2") + self.verticalLayout_5.addWidget(self.lineEdit_players_2) + self.horizontalSlider_players_2 = QtWidgets.QSlider(parent=self.groupBox_settings_2) + self.horizontalSlider_players_2.setMaximum(70) + self.horizontalSlider_players_2.setPageStep(1) + self.horizontalSlider_players_2.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.horizontalSlider_players_2.setObjectName("horizontalSlider_players_2") + self.verticalLayout_5.addWidget(self.horizontalSlider_players_2) + self.line_10 = QtWidgets.QFrame(parent=self.groupBox_settings_2) + self.line_10.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_10.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_10.setObjectName("line_10") + self.verticalLayout_5.addWidget(self.line_10) + self.label_Maps_2 = QtWidgets.QLabel(parent=self.groupBox_settings_2) + self.label_Maps_2.setMinimumSize(QtCore.QSize(0, 15)) + self.label_Maps_2.setMaximumSize(QtCore.QSize(16777215, 15)) + self.label_Maps_2.setScaledContents(True) + self.label_Maps_2.setObjectName("label_Maps_2") + self.verticalLayout_5.addWidget(self.label_Maps_2) + self.comboBox_maps_2 = QtWidgets.QComboBox(parent=self.groupBox_settings_2) + self.comboBox_maps_2.setObjectName("comboBox_maps_2") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.comboBox_maps_2.addItem("") + self.verticalLayout_5.addWidget(self.comboBox_maps_2) + self.verticalLayout_4.addWidget(self.groupBox_settings_2) + self.groupBox_7 = QtWidgets.QGroupBox(parent=self.groupBox_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.groupBox_7.sizePolicy().hasHeightForWidth()) + self.groupBox_7.setSizePolicy(sizePolicy) + self.groupBox_7.setMinimumSize(QtCore.QSize(485, 80)) + self.groupBox_7.setMaximumSize(QtCore.QSize(0, 125)) + self.groupBox_7.setObjectName("groupBox_7") + self.lineEdit_rconcmd_2 = QtWidgets.QLineEdit(parent=self.groupBox_7) + self.lineEdit_rconcmd_2.setGeometry(QtCore.QRect(10, 40, 371, 32)) + self.lineEdit_rconcmd_2.setText("") + self.lineEdit_rconcmd_2.setObjectName("lineEdit_rconcmd_2") + self.pushButton_rconcmd_2 = QtWidgets.QPushButton(parent=self.groupBox_7) + self.pushButton_rconcmd_2.setGeometry(QtCore.QRect(390, 40, 88, 33)) + self.pushButton_rconcmd_2.setMinimumSize(QtCore.QSize(0, 33)) + self.pushButton_rconcmd_2.setMaximumSize(QtCore.QSize(16777215, 33)) + self.pushButton_rconcmd_2.setObjectName("pushButton_rconcmd_2") + self.label_rconcmd_2 = QtWidgets.QLabel(parent=self.groupBox_7) + self.label_rconcmd_2.setGeometry(QtCore.QRect(10, 20, 91, 18)) + self.label_rconcmd_2.setScaledContents(True) + self.label_rconcmd_2.setObjectName("label_rconcmd_2") + self.verticalLayout_4.addWidget(self.groupBox_7) + self.horizontalLayout_2.addWidget(self.groupBox_2) + self.line_11 = QtWidgets.QFrame(parent=self.tab_6) + self.line_11.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_11.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.line_11.setObjectName("line_11") + self.horizontalLayout_2.addWidget(self.line_11) + self.scrollArea_2 = QtWidgets.QScrollArea(parent=self.tab_6) + self.scrollArea_2.setWidgetResizable(True) + self.scrollArea_2.setObjectName("scrollArea_2") + self.scrollAreaWidgetContents_2 = QtWidgets.QWidget() + self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 970, 923)) + self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2") + self.gridLayout_7 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_2) + self.gridLayout_7.setObjectName("gridLayout_7") + self.tabWidget_ini_2 = QtWidgets.QTabWidget(parent=self.scrollAreaWidgetContents_2) + self.tabWidget_ini_2.setObjectName("tabWidget_ini_2") + self.tab_gameini_2 = QtWidgets.QWidget() + self.tab_gameini_2.setObjectName("tab_gameini_2") + self.gridLayout_8 = QtWidgets.QGridLayout(self.tab_gameini_2) + self.gridLayout_8.setObjectName("gridLayout_8") + self.kdialog_2 = QtWidgets.QDialog(parent=self.tab_gameini_2) + self.kdialog_2.setObjectName("kdialog_2") + self.tableView_3 = QtWidgets.QTableView(parent=self.kdialog_2) + self.tableView_3.setGeometry(QtCore.QRect(0, 0, 941, 862)) + self.tableView_3.setGridStyle(QtCore.Qt.PenStyle.SolidLine) + self.tableView_3.setObjectName("tableView_3") + self.tableView_3.horizontalHeader().setVisible(True) + self.tableView_3.horizontalHeader().setCascadingSectionResizes(False) + self.gridLayout_8.addWidget(self.kdialog_2, 0, 0, 1, 1) + self.tabWidget_ini_2.addTab(self.tab_gameini_2, "") + self.tab_gameusersettingsini_2 = QtWidgets.QWidget() + self.tab_gameusersettingsini_2.setObjectName("tab_gameusersettingsini_2") + self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_gameusersettingsini_2) + self.gridLayout_9.setObjectName("gridLayout_9") + self.tableView_4 = QtWidgets.QTableView(parent=self.tab_gameusersettingsini_2) + self.tableView_4.setGridStyle(QtCore.Qt.PenStyle.SolidLine) + self.tableView_4.setObjectName("tableView_4") + self.tableView_4.horizontalHeader().setVisible(True) + self.tableView_4.horizontalHeader().setCascadingSectionResizes(False) + self.gridLayout_9.addWidget(self.tableView_4, 0, 0, 1, 1) + self.tabWidget_ini_2.addTab(self.tab_gameusersettingsini_2, "") + self.gridLayout_7.addWidget(self.tabWidget_ini_2, 0, 0, 1, 1) + self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2) + self.horizontalLayout_2.addWidget(self.scrollArea_2) + self.tabServers_2.addTab(self.tab_6, "") + self.horizontalLayout_3.addWidget(self.tabServers_2) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap("./../../Yandex.Disk/Изображения/Оформление/7dtd.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabGames.addTab(self.tab_2, icon2, "") @@ -340,6 +545,8 @@ class Ui_mainWindow(object): self.menu.setObjectName("menu") self.menu_2 = QtWidgets.QMenu(parent=self.menubar) self.menu_2.setObjectName("menu_2") + self.menu_3 = QtWidgets.QMenu(parent=self.menubar) + self.menu_3.setObjectName("menu_3") mainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(parent=mainWindow) self.statusbar.setObjectName("statusbar") @@ -352,6 +559,10 @@ class Ui_mainWindow(object): self.action_HLN_A.setObjectName("action_HLN_A") self.action_Discord = QtGui.QAction(parent=mainWindow) self.action_Discord.setObjectName("action_Discord") + self.action_3 = QtGui.QAction(parent=mainWindow) + self.action_3.setObjectName("action_3") + self.action_4 = QtGui.QAction(parent=mainWindow) + self.action_4.setObjectName("action_4") self.menu.addSeparator() self.menu.addAction(self.action_HLN_A) self.menu.addSeparator() @@ -361,6 +572,9 @@ class Ui_mainWindow(object): self.menu_2.addSeparator() self.menu_2.addAction(self.action_Discord) self.menu_2.addSeparator() + self.menu_3.addAction(self.action_3) + self.menu_3.addAction(self.action_4) + self.menubar.addAction(self.menu_3.menuAction()) self.menubar.addAction(self.menu.menuAction()) self.menubar.addAction(self.menu_2.menuAction()) @@ -368,6 +582,8 @@ class Ui_mainWindow(object): self.tabGames.setCurrentIndex(0) self.tabServers.setCurrentIndex(0) self.tabWidget_ini.setCurrentIndex(0) + self.tabServers_2.setCurrentIndex(0) + self.tabWidget_ini_2.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(mainWindow) def retranslateUi(self, mainWindow): @@ -389,7 +605,7 @@ class Ui_mainWindow(object): self.lineEdit_adminpassword.setText(_translate("mainWindow", "Marvin")) self.label_password.setText(_translate("mainWindow", "Пароль сессии")) self.label_players.setText(_translate("mainWindow", "Кол-во игроков")) - self.lineEdit_players.setText(_translate("mainWindow", "27042")) + self.lineEdit_players.setText(_translate("mainWindow", "70")) self.label_Maps.setText(_translate("mainWindow", "Карта")) self.comboBox_maps.setItemText(0, _translate("mainWindow", "Остров (The Island)")) self.comboBox_maps.setItemText(1, _translate("mainWindow", "Выжженые земли (Scorched Earth)")) @@ -409,23 +625,50 @@ class Ui_mainWindow(object): self.tabWidget_ini.setTabText(self.tabWidget_ini.indexOf(self.tab_gameini), _translate("mainWindow", "Game.ini")) self.tabWidget_ini.setTabText(self.tabWidget_ini.indexOf(self.tab_gameusersettingsini), _translate("mainWindow", "GameUserSettings.ini")) self.tabServers.setTabText(self.tabServers.indexOf(self.tab_5), _translate("mainWindow", "Tab 1")) - self.tabServers.setTabText(self.tabServers.indexOf(self.tab), _translate("mainWindow", "Страница")) self.tabGames.setTabText(self.tabGames.indexOf(self.tabArk), _translate("mainWindow", "ARK")) - self.groupBox_4.setTitle(_translate("mainWindow", "xml")) - self.label_8.setText(_translate("mainWindow", "Имя сессии")) - self.textEdit_9.setHtml(_translate("mainWindow", "\n" -"\n" -"


")) - self.label_9.setText(_translate("mainWindow", "Порт")) - self.label_12.setText(_translate("mainWindow", "Пароль сессии")) - self.label_13.setText(_translate("mainWindow", "Пароль администратора")) - self.label_14.setText(_translate("mainWindow", "Количество игроков")) + self.groupBox_settings_2.setTitle(_translate("mainWindow", "Настройки")) + self.checkBox_cluster_2.setText(_translate("mainWindow", "Кластер")) + self.lineEdit_cluster_2.setText(_translate("mainWindow", "id-кластера")) + self.checkBox_listen_2.setText(_translate("mainWindow", "Передавать в глобальный список серверов")) + self.label_namesession_2.setText(_translate("mainWindow", "Имя сессии")) + self.lineEdit_namesession_2.setText(_translate("mainWindow", "Имя_сессии ")) + self.label_port_2.setText(_translate("mainWindow", "Порт")) + self.lineEdit_port_2.setText(_translate("mainWindow", "7777")) + self.label_querryport_2.setText(_translate("mainWindow", "Querry порт")) + self.lineEdit_querryport_2.setText(_translate("mainWindow", "27015")) + self.label_rconport_2.setText(_translate("mainWindow", "Rcon порт")) + self.lineEdit_rconport_2.setText(_translate("mainWindow", "27042")) + self.label_adminpassword_2.setText(_translate("mainWindow", "Пароль администратора (Marvin)")) + self.lineEdit_adminpassword_2.setText(_translate("mainWindow", "Marvin")) + self.label_password_2.setText(_translate("mainWindow", "Пароль сессии")) + self.label_players_2.setText(_translate("mainWindow", "Кол-во игроков")) + self.lineEdit_players_2.setText(_translate("mainWindow", "70")) + self.label_Maps_2.setText(_translate("mainWindow", "Карта")) + self.comboBox_maps_2.setItemText(0, _translate("mainWindow", "Остров (The Island)")) + self.comboBox_maps_2.setItemText(1, _translate("mainWindow", "Выжженые земли (Scorched Earth)")) + self.comboBox_maps_2.setItemText(2, _translate("mainWindow", "Аберация (Aberration)")) + self.comboBox_maps_2.setItemText(3, _translate("mainWindow", "Вымирание (Extinction)")) + self.comboBox_maps_2.setItemText(4, _translate("mainWindow", "Genesis: Part 1")) + self.comboBox_maps_2.setItemText(5, _translate("mainWindow", "Genesis: Part 2")) + self.comboBox_maps_2.setItemText(6, _translate("mainWindow", "Центр (The Center)")) + self.comboBox_maps_2.setItemText(7, _translate("mainWindow", "Рагнарёк (Ragnarok)")) + self.comboBox_maps_2.setItemText(8, _translate("mainWindow", "Valguero")) + self.comboBox_maps_2.setItemText(9, _translate("mainWindow", "Кристальные острова (Crystal Island)")) + self.comboBox_maps_2.setItemText(10, _translate("mainWindow", "Потерянные острова (Lost Island)")) + self.comboBox_maps_2.setItemText(11, _translate("mainWindow", "Фьйордур (Fjordur)")) + self.groupBox_7.setTitle(_translate("mainWindow", "RCON")) + self.pushButton_rconcmd_2.setText(_translate("mainWindow", "Отправить")) + self.label_rconcmd_2.setText(_translate("mainWindow", "Rcon команда")) + self.tabWidget_ini_2.setTabText(self.tabWidget_ini_2.indexOf(self.tab_gameini_2), _translate("mainWindow", "Game.ini")) + self.tabWidget_ini_2.setTabText(self.tabWidget_ini_2.indexOf(self.tab_gameusersettingsini_2), _translate("mainWindow", "GameUserSettings.ini")) + self.tabServers_2.setTabText(self.tabServers_2.indexOf(self.tab_6), _translate("mainWindow", "Tab 1")) self.tabGames.setTabText(self.tabGames.indexOf(self.tab_2), _translate("mainWindow", "7 Days to Die")) self.menu.setTitle(_translate("mainWindow", "Настройки")) self.menu_2.setTitle(_translate("mainWindow", "Справка")) + self.menu_3.setTitle(_translate("mainWindow", "Сервер")) self.action.setText(_translate("mainWindow", "Лицензия")) self.action_2.setText(_translate("mainWindow", "Об авторах")) self.action_HLN_A.setText(_translate("mainWindow", "Настроить HLN-A")) self.action_Discord.setText(_translate("mainWindow", "Сообщество Discord")) + self.action_3.setText(_translate("mainWindow", "Добавить")) + self.action_4.setText(_translate("mainWindow", "Удалить")) From 3658f059aa5718174f80cbf21a4813fcbdbd04c6 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 28 May 2023 19:30:37 +0300 Subject: [PATCH 07/71] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20yaml=20=D0=B8=20systemd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 164 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 88 insertions(+), 76 deletions(-) diff --git a/hlna.py b/hlna.py index 5084153..d4aab90 100755 --- a/hlna.py +++ b/hlna.py @@ -175,7 +175,7 @@ def ports_array(): query_p = [] rcon_p = [] for k in list_config: - data_port = read_yaml(k, game="ARK") + data_port = read_yaml(k, g="ark") port_s.append(data_port['Port']) query_p.append(data_port['QueryPort']) rcon_p.append(data_port['RCONPort']) @@ -191,7 +191,7 @@ def ports(port, ports_arr, flag): elif flag == 1: port = 27015 elif flag == 2: - port = 27044 + port = 23331 print_line("Port=", port) return port else: @@ -371,12 +371,13 @@ def config_ark(list_config=list_config): create_dir(dir_server_ark) create_dir(dir_maps_ark) + id_mods_ark = "" cluster_server, cluster_id, cluster_dir_override = config_cluster() if list_config: print("Уже установленные карты: ") for i in list_config: - data = read_yaml(i, game="ARK") + data = read_yaml(i, g="ark") print(f"{i} : {data['map']}") count_maps = config_nummap() print_line(count_maps) @@ -393,12 +394,9 @@ def config_ark(list_config=list_config): max_players = config_players() listen_server = config_listen() - print_line(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("ARK", "", cluster_server, map_s, list_config[-1], port_server, query_port, + yaml_create("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) + id_mods_ark, cluster_id, cluster_dir_override, listen_server) def config_7daystodie(): @@ -422,11 +420,14 @@ def xml_parser(): print("Я пока не умею парсить xml))", flag=False) -def yaml_create(game, dir_server="", cluster_server="", map_s="", name_server="", port_server="", query_port="", +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=""): """Создаёт на основании собранных данных yaml конфиг""" - if game == "ARK": + if g == "ark": + print_line(type(id_mods_ark)) + print_line(id_mods_ark) + print_line(name_server) path_yaml = dir_maps_ark + name_server settings = [ { @@ -447,7 +448,7 @@ def yaml_create(game, dir_server="", cluster_server="", map_s="", name_server="" 'clusterdir': cluster_dir_override } ] - elif game == "path_server": + elif g == "path_server": path_yaml = dir_config + "config" settings = [ { @@ -458,21 +459,20 @@ def yaml_create(game, dir_server="", cluster_server="", map_s="", name_server="" with open(path_yaml, 'w') as yamlfile: yaml.dump(settings, yamlfile) print(colorama.Fore.GREEN + f"Конфиг {path_yaml} создан" + colorama.Style.RESET_ALL) - if game != "path_server": - systemd_unit_create(game) + if g != "path_server": + systemd_unit_create(g, name_server) -def systemd_unit_create(game, config_7days="", name_server=list_config): +def systemd_unit_create(g, name_server=list_config, config_7days=""): """Создаёт на основании yaml конфига systemd юнит""" - if game == "ARK": + if g == "ark": id_game = "376030" - for i in name_server: - 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}" - unit_file = f"{dir_unit}ark_{data['SessionName']}.service".lower() - elif game == "7Days": + data = read_yaml(name_server, g="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']}?ModsId={data['ModsId']}?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 g == "7Days": id_game = "294420" # сюда дописать обращение к xml_parser для получения уникального имени сервера unit_dir_server = dir_server_7days @@ -480,7 +480,7 @@ def systemd_unit_create(game, config_7days="", name_server=list_config): unit_file = f"{dir_unit}7days.service".lower() unit_text = f'''[Unit] -Description={game}: Server +Description={g}: Server Wants=network-online.target After=syslog.target network.target nss-lookup.target network-online.target @@ -498,7 +498,7 @@ WantedBy=default.target with open(unit_file, 'w') as systemd_unit: systemd_unit.write(unit_text) unit_name = unit_file.split("/")[-1] - os.system(f"systemctl --user unmask {unit_name}") + print(colorama.Fore.GREEN + f"Юнит {unit_name} создан" + colorama.Style.RESET_ALL) os.system('systemctl --user daemon-reload') os.system(f"systemctl --user enable {unit_name}") @@ -510,11 +510,15 @@ WantedBy=default.target @click.argument('id_mods_ark', nargs=-1) def mod(g, m, i, id_mods_ark): if g == "ark": + check_exist_servers(g) if not os.path.isdir(dir_mods_ark): create_dir(dir_mods_ark) id_mods_ark = id_mods_ark[0].split(',') if id_mods_ark[1] != "": + id_mods = "" for id_mod in id_mods_ark: + id_mods += ","+id_mod + id_mods = id_mods[1:] dir_mod_ark = f"{dir_mods_ark}/{id_mod}" if not os.path.isfile(f"{dir_mod_ark}.mod"): if i: @@ -528,6 +532,13 @@ def mod(g, m, i, id_mods_ark): else: print_line(f"Мод уже установлен") modupdate(g, m, id_mod, dir_mod_ark) + name_server = choose_map(g, m) + 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['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], data['ServerPassword'], + data['MaxPlayers'], id_mods_ark, data['clusterid'], data['clusterdir'], data['Listen']) else: print_line("Введите id модов через запятую без пробелов") else: @@ -671,10 +682,10 @@ def switch(g, m, e): #добавить all data['Port'] = ports(data['Port'], port_s, e) data['QueryPort'] = ports(data['QueryPort'], port_s, e) data['RCONPort'] = ports(data['RCONPort'], port_s, e) - yaml_create("ARK", data['map'], data['Cluster'], data['SessionName'], data['Port'], data['QueryPort'], - data['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], data['ServerPassword'], - data['MaxPlayers'], data['ModsId'], data['Listen'], data['ServerPath'], data['clusterid'], - data['clusterdir']) + 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'], data['ModsId'], data['clusterid'], data['clusterdir'], + data['Listen']) x = os.system( f"rm {dir_deactivated}{i} >> {dir_logs}{date} 2>&1") with open(f"{dir_logs}{date}.log", "a") as f: @@ -700,7 +711,7 @@ def status(list_config=list_config): print_line("Сервера не сконфигурированы", flag=False) else: for i in list_config: - data = read_yaml(i, game="ARK") + data = read_yaml(i, g="ark") x = os.system(f"lsof -w -i :{data['Port']}") if x == 0: print_line("Сервер запущен") @@ -781,34 +792,19 @@ def check_exist_servers(g): print_line("7Days") -def start_stop(action, g, m, list_config=list_config): +def start_stop(action, g, m): """Функция изменения статусов сервера""" if g == "ark": check_exist_servers(g) - dict_mapname = {} - dict_allmapname = [] - for i in list_config: - data = read_yaml(i, game="ARK") - dict_mapname[data['SessionName']] = data['map'] - dict_allmapname.append(data['SessionName']) - names_serverstart = [] - for ns, v in dict_mapname.items(): - if v in m: - names_serverstart.append(ns) - if list_config != []: # Перенести выше для проверки наличия конфигов - 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, game="ARK") - if action == "stop" or action == "restart": - rcon_local(i, "SaveWorld") - x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") + name_servers = choose_map(g, m) + for i in name_servers: + data = read_yaml(i, g="ark", flag=True) + if action == "stop" or action == "restart": + rcon_local(i, "SaveWorld") + x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") - if x == 0: - print_line(f"Готово {action} для {g}") + if x == 0: + print_line(f"Готово {action} для {g}") elif g == "7days": x = os.system(f"systemctl --user {action} 7days.service") @@ -818,38 +814,54 @@ def start_stop(action, g, m, list_config=list_config): return -def read_yaml(list_config=list_config, flag=True, game=""): +def read_yaml(list_config=list_config, flag=True, m="", g=""): """Читает конфиги и отдаёт данные туда где их запросили""" # Читаем конфиги активных или неактивных карт в зависимости от флага - if game == "ARK": + if g == "ark": + if m == "all": + list_config=list_config path_yaml = f"{dir_maps_ark}{list_config}" if flag else f"{dir_deactivated}{list_config}" - elif game == "path_server": + elif g == "path_server": path_yaml = dir_config + "config" with open(path_yaml, "r") as yamlfile: data = yaml.load(yamlfile, Loader=yaml.FullLoader) return data[0] # возвращаем словарь со всеми значениями -def choose_map(arr): +def choose_map(g, m, list_config=list_config): """Функция выбора карт""" - new_arr = [] - arr = sorted(arr) - print('Найдены сервера с этой картой') - for i, map in enumerate(arr): - print(f"{i + 1}) {map}") - while True: - try: - x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') - x = [int(i) for i in x] - break - except: - print_line("Неправильный ввод",flag=False) + if g == "ark": + dict_mapname = {} + dict_allmapname = [] + for i in list_config: + data = read_yaml(i, g="ark") + dict_mapname[data['SessionName']] = data['map'] + dict_allmapname.append(data['SessionName']) + name_servers = [] + for ns, v in dict_mapname.items(): + if v in m: + name_servers.append(ns) + if list_config != []: # Перенести выше для проверки наличия конфигов + if m == "all": + name_servers = dict_allmapname + print(f"Выполняется для карт(-ы) {name_servers}") + else: + name_servers = sorted(name_servers) + print('Найдены сервера с этой картой') + for i, map in enumerate(name_servers): + print(f"{i + 1}) {map}") + while True: + try: + x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') + x = [int(i) for i in x] + break + except: + print_line("Неправильный ввод", flag=False) + for i in x: + name_servers.append(name_servers[i - 1]) + print('Выбранные сервера:', name_servers) - for i in x: - new_arr.append(arr[i - 1]) - print('Выбранные сервера:', new_arr) - - return new_arr + return name_servers @hlna.command(help='Отправка команд на игровой сервер через rcon ') @@ -866,7 +878,7 @@ def rcon_local(m, c): if list_config: rcon_ports = [] for i in list_config: - data = read_yaml(i, game="ARK") + data = read_yaml(i, g="ark") dict_mapname[data['RCONPort']] = data['map'] dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] if m == "all": @@ -896,7 +908,7 @@ def zero(x=""): if not os.path.exists(dir_config + "config"): dir_server = path_server() else: - data = read_yaml(game="path_server") + data = read_yaml(g="path_server") if data['path_server'] == "": path_server() else: From 1acba298f45afece6184f81c0773b6b37b03c9ed Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 28 May 2023 19:38:09 +0300 Subject: [PATCH 08/71] 1 --- hlna.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index d4aab90..cd9bd37 100755 --- a/hlna.py +++ b/hlna.py @@ -518,7 +518,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_mods[1:] + dir_mod_ark = f"{dir_mods_ark}/{id_mod}" if not os.path.isfile(f"{dir_mod_ark}.mod"): if i: @@ -533,6 +533,7 @@ def mod(g, m, i, id_mods_ark): print_line(f"Мод уже установлен") modupdate(g, m, id_mod, dir_mod_ark) name_server = choose_map(g, m) + id_mods = id_mods[1:] id_mods_ark = id_mods for i in name_server: data = read_yaml(i, g="ark") From 9d7330f560505a78a082d30a365447ca93608a72 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 28 May 2023 19:57:43 +0300 Subject: [PATCH 09/71] print_line --- hlna.py | 86 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/hlna.py b/hlna.py index cd9bd37..f581ffb 100755 --- a/hlna.py +++ b/hlna.py @@ -97,7 +97,7 @@ def unpack(src, dst): if size_unpacked != size_indexed: msg = f"Header-Index mismatch. Header indicates it should only have {size_unpacked} bytes when uncompressed but the index indicates {size_indexed} bytes." logging.critical(msg) - return print_line(msg, flag=False) + return print_line(msg, flag="RED") # Read the actual archive data data = b'' @@ -115,19 +115,19 @@ def unpack(src, dst): if len(uncompressed_data) != size_unpacked_chunk and read_data != len(compression_index): msg = f"Index contains more than one partial chunk: was {len(uncompressed_data)} when the full chunk size is {size_unpacked_chunk}, chunk {read_data}/{len(compression_index)}" logging.critical(msg) - return print_line(msg, flag=False) + return print_line(msg, flag="RED") else: msg = f"Uncompressed chunk size is not the same as in the index: was {len(uncompressed_data)} but should be {uncompressed}." logging.critical(msg) - return print_line(msg, flag=False) + return print_line(msg, flag="RED") else: msg = f"Data types in the headers should be int's. Size Types: unpacked_chunk({type(size_unpacked_chunk)}), packed({type(size_packed)}), unpacked({type(size_unpacked)})" logging.critical(msg) - return print_line(msg, flag=False) + return print_line(msg, flag="RED") else: msg = "The signature and format version is incorrect. Signature was {} should be 2653586369.".format(sigver) logging.critical(msg) - return print_line(msg,flag=False) + return print_line(msg,flag="RED") # Write the extracted data to disk with open(dst, 'wb') as f: @@ -135,9 +135,16 @@ def unpack(src, dst): logging.info("Archive has been extracted.") -def print_line(*text, flag=True): +def print_line(*text, flag=""): """Добавление обводки вокруг текста, покраска""" - color = colorama.Fore.GREEN if flag else colorama.Fore.RED + if flag == "RED": + color = colorama.Fore.RED + elif flag == "YELLOW": + color = colorama.Fore.YELLOW + elif flag == "GREEN": + color = colorama.Fore.GREEN + elif flag == "CYAN": + color = colorama.Fore.CYAN print(colorama.Fore.YELLOW + "." * 30) print(color, *text) print(colorama.Fore.YELLOW + "." * 30 + colorama.Style.RESET_ALL) @@ -153,7 +160,7 @@ def check_int(number=""): x = int(x) return x except ValueError: - print_line("Введите число") + print_line("Введите число", flag="CYAN") @hlna.command(help='Выбор игры и сбор настроек для сервера(-ов)') @@ -167,7 +174,7 @@ def config(): elif count_game == 2: config_7daystodie() else: - print_line("Пока есть только ARK и 7Days xD") + print_line("Пока есть только ARK и 7Days xD", flag="YELLOW") def ports_array(): @@ -192,13 +199,13 @@ def ports(port, ports_arr, flag): port = 27015 elif flag == 2: port = 23331 - print_line("Port=", port) + print_line("Port=", port, flag="CYAN") return port else: port = max(ports_arr) + 2 - print_line("Port=", port) + print_line("Port=", port, flag="CYAN") if port in ports_arr: - print("Порт уже занят") + print_line("Порт уже занят", flag="RED") else: return port @@ -300,15 +307,13 @@ def config_nameserver(map_s): new_name = f"{map_s}{str(count)}" count += 1 list_config.append(new_name) - print_line(list_config) break else: - print_line(list_config) list_config.append(map_s) break else: if name_server in list_config: - print_line("Имя занято", flag=False) + print_line("Имя занято", flag="RED") config_nameserver(map_s) else: list_config.append(name_server) # если enter, то ставим последним элементом карту @@ -380,10 +385,8 @@ def config_ark(list_config=list_config): data = read_yaml(i, g="ark") print(f"{i} : {data['map']}") count_maps = config_nummap() - print_line(count_maps) for i in range(count_maps): map_s, port_s, query_p, rcon_p = config_maps(i) - print_line(map_s, port_s, query_p, rcon_p) list_config = config_nameserver(map_s) port_server = config_ports(port_s) query_port = config_query(query_p) @@ -409,7 +412,7 @@ def config_7daystodie(): elif config_7days == "serverconfig": config_7days = "serverconfig" elif config_7days in list_simvols: - print_line("Запрещённые символы", flag=False) + print_line("Запрещённые символы", flag="RED") else: xml_parser() systemd_unit_create("7Days", config_7days) @@ -425,9 +428,6 @@ def yaml_create(g, dir_server="", cluster_server="", map_s="", name_server="", p id_mods_ark="", cluster_id="", cluster_dir_override="", listen_server=""): """Создаёт на основании собранных данных yaml конфиг""" if g == "ark": - print_line(type(id_mods_ark)) - print_line(id_mods_ark) - print_line(name_server) path_yaml = dir_maps_ark + name_server settings = [ { @@ -522,15 +522,15 @@ def mod(g, m, i, id_mods_ark): dir_mod_ark = f"{dir_mods_ark}/{id_mod}" if not os.path.isfile(f"{dir_mod_ark}.mod"): if i: - print_line(f"Скачиваем мод {id_mod}") + print_line(f"Скачиваем мод {id_mod}", flag="CYAN") moddownload(g, m, id_mod, dir_mod_ark) else: os.system(f"rm -rf {dir_mod_ark}") - print_line(f"{dir_mod_ark} удалён") + print_line(f"{dir_mod_ark} удалён", flag="CYAN") os.system(f"rm {dir_mods_ark}/{id_mod}.mod") - print_line(f"{dir_mods_ark}/{id_mod}.mod удалён") + print_line(f"{dir_mods_ark}/{id_mod}.mod удалён", flag="CYAN") else: - print_line(f"Мод уже установлен") + print_line(f"Мод уже установлен", flag="CYAN") modupdate(g, m, id_mod, dir_mod_ark) name_server = choose_map(g, m) id_mods = id_mods[1:] @@ -541,14 +541,14 @@ def mod(g, m, i, id_mods_ark): data['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], data['ServerPassword'], data['MaxPlayers'], id_mods_ark, data['clusterid'], data['clusterdir'], data['Listen']) else: - print_line("Введите id модов через запятую без пробелов") + print_line("Введите id модов через запятую без пробелов", flag="CYAN") else: - print_line("Не поддерживаемая игра") + print_line("Не поддерживаемая игра", flag="RED") def modupdate(g, m, id_mod, dir_mod_ark): if g == "ark": - print_line(f"Проверяем обновление мода {id_mod}") + print_line(f"Проверяем обновление мода {id_mod}", flag="CYAN") with open(os.path.join(dir_mod_ark, f"appworkshop_346110.acf"), "r") as f: content = f.readlines() content = "".join(content) @@ -571,14 +571,14 @@ def modupdate(g, m, id_mod, dir_mod_ark): steam_date = json_zapros['response']['publishedfiledetails'][0]['time_updated'] if int(steam_date) != int(locale_date): - print_line(f"Обновляем мод {id_mod}") + print_line(f"Обновляем мод {id_mod}", flag="CYAN") moddownload(g, m, id_mod, dir_mod_ark) else: - print_line(f"Мод {id_mod} обновлен") + print_line(f"Мод {id_mod} обновлен", flag="GREEN") def modupdateall(g, m): - print_line("Проверяем обновление всех установленных модов") + print_line("Проверяем обновление всех установленных модов", flag="CYAN") for file in os.listdir(dir_mods_ark): if os.path.isfile(os.path.join(dir_mods_ark, file)): if file.endswith('.mod'): @@ -701,23 +701,23 @@ def switch(g, m, e): #добавить all enable = "enable" if e else "disable" os.system(f"systemctl --user {enable} ark_{i}") else: - print_line(f"Ошибка перемещения {i}", flag=False) + print_line(f"Ошибка перемещения {i}", flag="RED") except: - print_line("ошибка операции", flag=False) + print_line("ошибка операции", flag="RED") @hlna.command(help='Выводит статус настроеных серверов') def status(list_config=list_config): if list_config == [] and delist_config == []: - print_line("Сервера не сконфигурированы", flag=False) + print_line("Сервера не сконфигурированы", flag="RED") else: for i in list_config: data = read_yaml(i, g="ark") x = os.system(f"lsof -w -i :{data['Port']}") if x == 0: - print_line("Сервер запущен") + print_line("Сервер запущен", flag="GREEN") else: - print_line("Сервер не запущен", flag=False) + print_line("Сервер не запущен", flag="RED") # этот принт надо отдельной функцией сделать, чтобы убрать дублирование текста @@ -786,11 +786,11 @@ def check_exist_servers(g): """Проверяет наличие конфигов для активных карт""" if g == "ark": if list_config == []: - print_line("Нет сконфигурированных серверов", flag=False) # добавить отсюда вилку на вопрос с конфигурацией + print_line("Нет сконфигурированных серверов", flag="RED") # добавить отсюда вилку на вопрос с конфигурацией else: return elif g == "7days": - print_line("7Days") + print_line("7Days", flag="CYAN") def start_stop(action, g, m): @@ -805,12 +805,12 @@ def start_stop(action, g, m): x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") if x == 0: - print_line(f"Готово {action} для {g}") + print_line(f"Готово {action} для {g}", flag="GREEN") elif g == "7days": x = os.system(f"systemctl --user {action} 7days.service") if x == 0: - print_line("Готово") + print_line("Готово", flag="GREEN") else: return @@ -857,7 +857,7 @@ def choose_map(g, m, list_config=list_config): x = [int(i) for i in x] break except: - print_line("Неправильный ввод", flag=False) + print_line("Неправильный ввод", flag="RED") for i in x: name_servers.append(name_servers[i - 1]) print('Выбранные сервера:', name_servers) @@ -894,11 +894,11 @@ def rcon_local(m, c): passwd = dict_adminpwd[port] with Client('127.0.0.1', port, passwd=str(passwd)) as client: response = client.run(c) - print_line(f"Rcon выполнен {response} {dict_mapname[port]}") + print_line(f"Rcon выполнен {response} {dict_mapname[port]}", flag="GREEN") else: pass except: - print_line(f"Ошибка отправки команды {c} в {m}", flag=False) + print_line(f"Ошибка отправки команды {c} в {m}", flag="RED") def zero(x=""): From 8f579eea3aff2123d8a7f57aaca7a8a55ee9c74d Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 28 May 2023 20:25:15 +0300 Subject: [PATCH 10/71] fs --- hlna.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index f581ffb..498c63a 100755 --- a/hlna.py +++ b/hlna.py @@ -579,6 +579,8 @@ def modupdate(g, m, id_mod, dir_mod_ark): 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): if os.path.isfile(os.path.join(dir_mods_ark, file)): if file.endswith('.mod'): @@ -845,7 +847,7 @@ def choose_map(g, m, list_config=list_config): if list_config != []: # Перенести выше для проверки наличия конфигов if m == "all": name_servers = dict_allmapname - print(f"Выполняется для карт(-ы) {name_servers}") + print_line(f"Выполняется для карт(-ы) {name_servers}", flag="CYAN") else: name_servers = sorted(name_servers) print('Найдены сервера с этой картой') From aa98e94a2250120fdd2fb39c31787810b1ce5bdc Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 28 May 2023 20:26:56 +0300 Subject: [PATCH 11/71] yaml --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 498c63a..851d682 100755 --- a/hlna.py +++ b/hlna.py @@ -581,7 +581,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): + 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] From b5eb8cb652389eaf08955e9c02d13ea23229815e Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 28 May 2023 20:42:40 +0300 Subject: [PATCH 12/71] pl --- hlna.py | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/hlna.py b/hlna.py index 851d682..2a7be95 100755 --- a/hlna.py +++ b/hlna.py @@ -222,7 +222,7 @@ def config_cluster(): while True: cluster_id = input("Укажите id для кластера, любое сочетание символов: \n") if cluster_id == '': - print("Введите символы: ") + print_line("Введите символы: ", glag="CYAN") else: create_dir(dir_server_ark + cluster_id) cluster_dir_override = (dir_server_ark + cluster_id) @@ -357,7 +357,7 @@ def config_players(): def config_listen(): - print("Передавать сервер в глобальный список серверов steam?") + print_line("Передавать сервер в глобальный список серверов steam?", flag="CYAN") listen_server_amount = check_int("""\n 1. Да 2. Нет @@ -380,10 +380,10 @@ def config_ark(list_config=list_config): cluster_server, cluster_id, cluster_dir_override = config_cluster() if list_config: - print("Уже установленные карты: ") + print_line("Уже установленные карты: ", flag="CYAN") for i in list_config: data = read_yaml(i, g="ark") - print(f"{i} : {data['map']}") + print_line(f"{i} : {data['map']}", flag="CYAN") count_maps = config_nummap() for i in range(count_maps): map_s, port_s, query_p, rcon_p = config_maps(i) @@ -420,7 +420,7 @@ def config_7daystodie(): def xml_parser(): """добавить документацию""" - print("Я пока не умею парсить xml))", flag=False) + print_line("Я пока не умею парсить xml))", flag="RED") def yaml_create(g, dir_server="", cluster_server="", map_s="", name_server="", port_server="", query_port="", @@ -458,7 +458,7 @@ def yaml_create(g, dir_server="", cluster_server="", map_s="", name_server="", p with open(path_yaml, 'w') as yamlfile: yaml.dump(settings, yamlfile) - print(colorama.Fore.GREEN + f"Конфиг {path_yaml} создан" + colorama.Style.RESET_ALL) + print_line(f"Конфиг {path_yaml} создан", flag="GREEN") if g != "path_server": systemd_unit_create(g, name_server) @@ -498,7 +498,7 @@ WantedBy=default.target with open(unit_file, 'w') as systemd_unit: systemd_unit.write(unit_text) unit_name = unit_file.split("/")[-1] - print(colorama.Fore.GREEN + f"Юнит {unit_name} создан" + colorama.Style.RESET_ALL) + print_line(f"Юнит {unit_name} создан", flag="GREEN") os.system('systemctl --user daemon-reload') os.system(f"systemctl --user enable {unit_name}") @@ -611,13 +611,13 @@ def moddownload(g, m, id_mod, dir_mod_ark): dst = os.path.join(curdir, name) uncompressed = os.path.join(curdir, file + ".uncompressed_size") unpack(src, dst) - print("[+] Extracted " + file) + print_line(f"[+] Извлечён {file}", flag="GREEN") os.remove(src) if os.path.isfile(uncompressed): os.remove(uncompressed) except Exception as e: - print(e) - print("[x] Unpacking .z files failed, aborting mod install") + print_line(e, flag="GREEN") + print_line(f"[x] Unpacking .z files failed, aborting mod install", flag="RED") return False os.system(f"rm -rf {dir_mod_ark}") @@ -678,7 +678,7 @@ def switch(g, m, e): #добавить all for i in m: try: if i in state_config: - print(f"Карта {i} уже есть в {state_msg}") + print_line(f"Карта {i} уже есть в {state_msg}", flag="CYAN") continue data = read_yaml(i, not e) if e: @@ -698,7 +698,7 @@ def switch(g, m, e): #добавить all with open(f"{dir_logs}{date}.log", "a") as f: f.write(f"[{t}] Сервер {i} перемещён из {state_msg}\n") if x == 0: - print(f"Готов - {i}") + print_line(f"Готов - {i}", flag="GREEN") #start = "start" if e else "stop" enable = "enable" if e else "disable" os.system(f"systemctl --user {enable} ark_{i}") @@ -723,7 +723,7 @@ def status(list_config=list_config): # этот принт надо отдельной функцией сделать, чтобы убрать дублирование текста - print(f""" + print_line(f""" Имя сервера: {i} Карта: {data['map']} Моды: {data['ModsId']} @@ -734,15 +734,14 @@ def status(list_config=list_config): Порт сервера: {data['Port']} Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} - Максимальное кол-во игроков: {data['MaxPlayers']}""") - print("-" * 40) + Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="CYAN") if delist_config != []: x = input("Есть неактивные сервера, показать Y/n: ") if x != "n": for i in delist_config: data = read_yaml(i, False) - print(f""" + print_line(f""" Имя сервера: {i} Карта: {data['map']} Моды: {data['ModsId']} @@ -753,8 +752,7 @@ def status(list_config=list_config): Порт сервера: {data['Port']} Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} - Максимальное кол-во игроков: {data['MaxPlayers']}""") - print("-" * 40) + Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="CYAN") @hlna.command(help='Запуск, сконфигурированного сервера или кластера ') @@ -850,9 +848,9 @@ def choose_map(g, m, list_config=list_config): print_line(f"Выполняется для карт(-ы) {name_servers}", flag="CYAN") else: name_servers = sorted(name_servers) - print('Найдены сервера с этой картой') + print_line('Найдены сервера с этой картой', flag="CYAN") for i, map in enumerate(name_servers): - print(f"{i + 1}) {map}") + print_line(f"{i + 1}) {map}", flag="CYAN") while True: try: x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') @@ -862,7 +860,7 @@ def choose_map(g, m, list_config=list_config): print_line("Неправильный ввод", flag="RED") for i in x: name_servers.append(name_servers[i - 1]) - print('Выбранные сервера:', name_servers) + print_line(f"Выбранные сервера: {name_servers}", flag="CYAN") return name_servers From a0a23158264ad27b1956e5b3bb77210c37ed8a20 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 19:40:19 +0300 Subject: [PATCH 13/71] =?UTF-8?q?=D0=BC=D0=B0=D0=BB=D0=B5=D0=BD=D1=8C?= =?UTF-8?q?=D0=BA=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hlna.py b/hlna.py index 2a7be95..4de7fa7 100755 --- a/hlna.py +++ b/hlna.py @@ -470,12 +470,14 @@ def systemd_unit_create(g, name_server=list_config, config_7days=""): data = read_yaml(name_server, g="ark") ntff = "" if not data['Cluster'] else "-NoTransferFromFiltering" unit_dir_server = dir_server_ark + dir_server_exec = f"{dir_server_ark}ShooterGame/Binaries/Linux/" systemd_unit_exec = f"{dir_server_exec}ShooterGameServer {data['map']}?listen={data['Listen']}?SessionName={data['SessionName']}?ModsId={data['ModsId']}?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 g == "7Days": id_game = "294420" # сюда дописать обращение к xml_parser для получения уникального имени сервера unit_dir_server = dir_server_7days + dir_server_exec = dir_server_7days systemd_unit_exec = f"{dir_server_7days}startserver.sh -configfile={config_7days}.xml" unit_file = f"{dir_unit}7days.service".lower() @@ -488,6 +490,7 @@ After=syslog.target network.target nss-lookup.target network-online.target ExecStartPre=/usr/bin/steamcmd +force_install_dir {unit_dir_server} +login anonymous +app_update {id_game} +quit TimeoutStartSec=99999 ExecStart={systemd_unit_exec} +WorkingDirectory={dir_server_exec} LimitNOFILE=100000 ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s INT $MAINPID @@ -782,7 +785,6 @@ def restart(g, m): def check_exist_servers(g): - """Проверяет наличие конфигов для активных карт""" if g == "ark": if list_config == []: @@ -805,7 +807,7 @@ def start_stop(action, g, m): x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") if x == 0: - print_line(f"Готово {action} для {g}", flag="GREEN") + print_line(f"Готово {action} для {g} {name_servers}", flag="GREEN") elif g == "7days": x = os.system(f"systemctl --user {action} 7days.service") @@ -816,8 +818,7 @@ def start_stop(action, g, m): def read_yaml(list_config=list_config, flag=True, m="", g=""): - """Читает конфиги и отдаёт данные туда где их запросили""" - # Читаем конфиги активных или неактивных карт в зависимости от флага + """Читает конфиги активных или неактивных карт в зависимости от флага и отдаёт данные туда где их запросили""" if g == "ark": if m == "all": list_config=list_config @@ -919,7 +920,6 @@ dir_unit = f"{home_dir}/.config/systemd/user/" dir_logs = f"{dir_config}logs/" dir_server_ark = f"{dir_server}ARK/" -dir_server_exec = f"{dir_server_ark}ShooterGame/Binaries/Linux/" dir_workshop_ark = f"{home_dir}/.local/share/Steam/steamapps/workshop" dir_shooter = "ShooterGame" dir_mods_ark = f"{dir_server_ark}ShooterGame/Content/Mods" From 3b38c025c75cd5a3182a2a897b74d52243e39e34 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 19:57:53 +0300 Subject: [PATCH 14/71] GameModIds --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 4de7fa7..fa87cfe 100755 --- a/hlna.py +++ b/hlna.py @@ -471,7 +471,7 @@ def systemd_unit_create(g, name_server=list_config, config_7days=""): ntff = "" if not data['Cluster'] else "-NoTransferFromFiltering" unit_dir_server = dir_server_ark dir_server_exec = f"{dir_server_ark}ShooterGame/Binaries/Linux/" - systemd_unit_exec = f"{dir_server_exec}ShooterGameServer {data['map']}?listen={data['Listen']}?SessionName={data['SessionName']}?ModsId={data['ModsId']}?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']}?GameModIds={data['ModsId']}?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 g == "7Days": id_game = "294420" From ebe72ae53e2d1e69bccb7b66482e7d902970ba36 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 20:44:42 +0300 Subject: [PATCH 15/71] wd --- hlna.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/hlna.py b/hlna.py index fa87cfe..ecfbe45 100755 --- a/hlna.py +++ b/hlna.py @@ -477,7 +477,6 @@ def systemd_unit_create(g, name_server=list_config, config_7days=""): id_game = "294420" # сюда дописать обращение к xml_parser для получения уникального имени сервера unit_dir_server = dir_server_7days - dir_server_exec = dir_server_7days systemd_unit_exec = f"{dir_server_7days}startserver.sh -configfile={config_7days}.xml" unit_file = f"{dir_unit}7days.service".lower() @@ -490,7 +489,6 @@ After=syslog.target network.target nss-lookup.target network-online.target ExecStartPre=/usr/bin/steamcmd +force_install_dir {unit_dir_server} +login anonymous +app_update {id_game} +quit TimeoutStartSec=99999 ExecStart={systemd_unit_exec} -WorkingDirectory={dir_server_exec} LimitNOFILE=100000 ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s INT $MAINPID From bcb61f10806771ee9a54661814ae63ad647d9b33 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 21:01:06 +0300 Subject: [PATCH 16/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index ecfbe45..23aa3aa 100755 --- a/hlna.py +++ b/hlna.py @@ -471,7 +471,7 @@ def systemd_unit_create(g, name_server=list_config, config_7days=""): ntff = "" if not data['Cluster'] else "-NoTransferFromFiltering" unit_dir_server = dir_server_ark dir_server_exec = f"{dir_server_ark}ShooterGame/Binaries/Linux/" - systemd_unit_exec = f"{dir_server_exec}ShooterGameServer {data['map']}?listen={data['Listen']}?SessionName={data['SessionName']}?GameModIds={data['ModsId']}?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']}?GameModIds={data['ModsId']} -clusterid={data['clusterid']} -ClusterDirOverride={data['clusterdir']} {ntff}" unit_file = f"{dir_unit}ark_{data['SessionName']}.service".lower() elif g == "7Days": id_game = "294420" From 5a24e8a7387ebbd8d3fe8fb2cda223976ab4197b Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 21:23:37 +0300 Subject: [PATCH 17/71] 1 --- hlna.py | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/hlna.py b/hlna.py index 23aa3aa..00018df 100755 --- a/hlna.py +++ b/hlna.py @@ -515,32 +515,32 @@ def mod(g, m, i, id_mods_ark): if not os.path.isdir(dir_mods_ark): create_dir(dir_mods_ark) id_mods_ark = id_mods_ark[0].split(',') - if id_mods_ark[1] != "": - id_mods = "" - for id_mod in id_mods_ark: - id_mods += ","+id_mod - dir_mod_ark = f"{dir_mods_ark}/{id_mod}" - if not os.path.isfile(f"{dir_mod_ark}.mod"): - if i: - print_line(f"Скачиваем мод {id_mod}", flag="CYAN") - moddownload(g, m, id_mod, dir_mod_ark) - else: - os.system(f"rm -rf {dir_mod_ark}") - print_line(f"{dir_mod_ark} удалён", flag="CYAN") - os.system(f"rm {dir_mods_ark}/{id_mod}.mod") - print_line(f"{dir_mods_ark}/{id_mod}.mod удалён", flag="CYAN") + id_mods = "" + for id_mod in id_mods_ark: + id_mods += ","+id_mod + + dir_mod_ark = f"{dir_mods_ark}/{id_mod}" + if not os.path.isfile(f"{dir_mod_ark}.mod"): + if i: + print_line(f"Скачиваем мод {id_mod}", flag="CYAN") + moddownload(g, m, id_mod, dir_mod_ark) else: - print_line(f"Мод уже установлен", flag="CYAN") - modupdate(g, m, id_mod, dir_mod_ark) - name_server = choose_map(g, m) - 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['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], data['ServerPassword'], - data['MaxPlayers'], id_mods_ark, data['clusterid'], data['clusterdir'], data['Listen']) + os.system(f"rm -rf {dir_mod_ark}") + print_line(f"{dir_mod_ark} удалён", flag="CYAN") + os.system(f"rm {dir_mods_ark}/{id_mod}.mod") + print_line(f"{dir_mods_ark}/{id_mod}.mod удалён", flag="CYAN") + else: + print_line(f"Мод уже установлен", flag="CYAN") + modupdate(g, m, id_mod, dir_mod_ark) + name_server = choose_map(g, m) + 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['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], data['ServerPassword'], + data['MaxPlayers'], id_mods_ark, data['clusterid'], data['clusterdir'], data['Listen']) else: print_line("Введите id модов через запятую без пробелов", flag="CYAN") else: From 43a3bc55a07ec862362a3c9e11b95f52c373e1aa Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 21:34:31 +0300 Subject: [PATCH 18/71] i --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 00018df..1859771 100755 --- a/hlna.py +++ b/hlna.py @@ -805,7 +805,7 @@ def start_stop(action, g, m): x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") if x == 0: - print_line(f"Готово {action} для {g} {name_servers}", flag="GREEN") + print_line(f"Готово {action} для {g} {i}", flag="GREEN") elif g == "7days": x = os.system(f"systemctl --user {action} 7days.service") From f31551bc2bfdd1bc2e0955bc9ad1e23e3f9b0178 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:02:38 +0300 Subject: [PATCH 19/71] action --- hlna.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hlna.py b/hlna.py index 1859771..b9e739b 100755 --- a/hlna.py +++ b/hlna.py @@ -796,6 +796,7 @@ def check_exist_servers(g): def start_stop(action, g, m): """Функция изменения статусов сервера""" if g == "ark": + print_line(action) check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: From b8429cf7df2e9cf41bde6cd1a64b365aff019773 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:03:07 +0300 Subject: [PATCH 20/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index b9e739b..49650c0 100755 --- a/hlna.py +++ b/hlna.py @@ -796,7 +796,7 @@ def check_exist_servers(g): def start_stop(action, g, m): """Функция изменения статусов сервера""" if g == "ark": - print_line(action) + print(action) check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: From 2316ac799a3a1177813fd4badaf23d82d826cc3c Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:04:24 +0300 Subject: [PATCH 21/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 49650c0..f81f752 100755 --- a/hlna.py +++ b/hlna.py @@ -800,9 +800,9 @@ def start_stop(action, g, m): check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: - data = read_yaml(i, g="ark", flag=True) if action == "stop" or action == "restart": rcon_local(i, "SaveWorld") + data = read_yaml(i, g="ark", flag=True) x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") if x == 0: From 2a51ec3e1cd7546a34e3d9679f69fb8cfaa21724 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:06:15 +0300 Subject: [PATCH 22/71] 1 --- hlna.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index f81f752..cf64bc6 100755 --- a/hlna.py +++ b/hlna.py @@ -796,10 +796,11 @@ def check_exist_servers(g): def start_stop(action, g, m): """Функция изменения статусов сервера""" if g == "ark": - print(action) + check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: + print(action) if action == "stop" or action == "restart": rcon_local(i, "SaveWorld") data = read_yaml(i, g="ark", flag=True) From d9425ea46e44e78c36a6a37b23f538a6957741b5 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:07:25 +0300 Subject: [PATCH 23/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index cf64bc6..f3e9edc 100755 --- a/hlna.py +++ b/hlna.py @@ -801,7 +801,7 @@ def start_stop(action, g, m): name_servers = choose_map(g, m) for i in name_servers: print(action) - if action == "stop" or action == "restart": + if action == stop or action == restart: rcon_local(i, "SaveWorld") data = read_yaml(i, g="ark", flag=True) x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") From 460e3f39c88d2df7a4a25de8470e49f1dd9ab757 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:09:01 +0300 Subject: [PATCH 24/71] 1 --- hlna.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hlna.py b/hlna.py index f3e9edc..441f71e 100755 --- a/hlna.py +++ b/hlna.py @@ -800,12 +800,13 @@ def start_stop(action, g, m): check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: - print(action) + if action == stop or action == restart: + print(action) + print_line(i) rcon_local(i, "SaveWorld") data = read_yaml(i, g="ark", flag=True) x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") - if x == 0: print_line(f"Готово {action} для {g} {i}", flag="GREEN") From 8d48beafd11e875e0070ced9cca46a13b296ab96 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:09:38 +0300 Subject: [PATCH 25/71] 1 --- hlna.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hlna.py b/hlna.py index 441f71e..063cac8 100755 --- a/hlna.py +++ b/hlna.py @@ -800,8 +800,7 @@ def start_stop(action, g, m): check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: - - if action == stop or action == restart: + if action == "stop" or action == "restart": print(action) print_line(i) rcon_local(i, "SaveWorld") From 4638c97a7cea13d41b6f530a83c2d6dbc90be1da Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:10:40 +0300 Subject: [PATCH 26/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 063cac8..913cdfc 100755 --- a/hlna.py +++ b/hlna.py @@ -802,7 +802,7 @@ def start_stop(action, g, m): for i in name_servers: if action == "stop" or action == "restart": print(action) - print_line(i) + print_line(i, flag="CYAN") rcon_local(i, "SaveWorld") data = read_yaml(i, g="ark", flag=True) x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") From bf623b853a34156b0d9a835dfc3d35420e549e38 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:15:20 +0300 Subject: [PATCH 27/71] 1 --- hlna.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hlna.py b/hlna.py index 913cdfc..413418e 100755 --- a/hlna.py +++ b/hlna.py @@ -874,6 +874,7 @@ def rcon(m, c): def rcon_local(m, c): + print_line("вход в rcon", flag="CYAN") try: dict_mapname = {} dict_adminpwd = {} From e8feb51bbe6e2a1b05d1de6761b6ab64d31b113d Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:21:40 +0300 Subject: [PATCH 28/71] 1 --- hlna.py | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/hlna.py b/hlna.py index 413418e..68e701c 100755 --- a/hlna.py +++ b/hlna.py @@ -796,13 +796,10 @@ def check_exist_servers(g): def start_stop(action, g, m): """Функция изменения статусов сервера""" if g == "ark": - check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: if action == "stop" or action == "restart": - print(action) - print_line(i, flag="CYAN") rcon_local(i, "SaveWorld") data = read_yaml(i, g="ark", flag=True) x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") @@ -874,29 +871,27 @@ def rcon(m, c): def rcon_local(m, c): - print_line("вход в rcon", flag="CYAN") try: + rcon_ports = [] dict_mapname = {} dict_adminpwd = {} - if list_config: - rcon_ports = [] - for i in list_config: - data = read_yaml(i, g="ark") - dict_mapname[data['RCONPort']] = data['map'] - dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] - if m == "all": - for rcon_p in dict_mapname: + for i in list_config: + data = read_yaml(i, g="ark") + dict_mapname[data['RCONPort']] = data['map'] + dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] + if m == "all": + for rcon_p in dict_mapname: + rcon_ports.append(rcon_p) + else: + for rcon_p, name_map in dict_mapname.items(): + if name_map in m: rcon_ports.append(rcon_p) - else: - for rcon_p, name_map in dict_mapname.items(): - if name_map in m: - rcon_ports.append(rcon_p) - for port in rcon_ports: - passwd = dict_adminpwd[port] - with Client('127.0.0.1', port, passwd=str(passwd)) as client: - response = client.run(c) - print_line(f"Rcon выполнен {response} {dict_mapname[port]}", flag="GREEN") + for port in rcon_ports: + passwd = dict_adminpwd[port] + with Client('127.0.0.1', port, passwd=str(passwd)) as client: + response = client.run(c) + print_line(f"Rcon выполнен {response} {dict_mapname[port]}", flag="GREEN") else: pass except: From 9139e77841adc4a2e7887477f32756d99b0692bf Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:24:58 +0300 Subject: [PATCH 29/71] 1 --- hlna.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hlna.py b/hlna.py index 68e701c..d9aabab 100755 --- a/hlna.py +++ b/hlna.py @@ -876,10 +876,12 @@ def rcon_local(m, c): dict_mapname = {} dict_adminpwd = {} for i in list_config: + print_line(i, flag="CYAN") data = read_yaml(i, g="ark") dict_mapname[data['RCONPort']] = data['map'] dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] if m == "all": + print_line(m, flag="CYAN") for rcon_p in dict_mapname: rcon_ports.append(rcon_p) else: From ba736255fc88adf297b85110442393ddb9db744c Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:25:46 +0300 Subject: [PATCH 30/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index d9aabab..0156ab3 100755 --- a/hlna.py +++ b/hlna.py @@ -870,7 +870,7 @@ def rcon(m, c): rcon_local(m, c) -def rcon_local(m, c): +def rcon_local(m="", c=""): try: rcon_ports = [] dict_mapname = {} From 20b22867471e5c4bd8ce51f4d6bb963e75bc7f71 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:27:47 +0300 Subject: [PATCH 31/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 0156ab3..cf16db8 100755 --- a/hlna.py +++ b/hlna.py @@ -800,7 +800,7 @@ def start_stop(action, g, m): name_servers = choose_map(g, m) for i in name_servers: if action == "stop" or action == "restart": - rcon_local(i, "SaveWorld") + rcon_local(i, c="SaveWorld") data = read_yaml(i, g="ark", flag=True) x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") if x == 0: From 271172b659a13332162e71256ac756b859a07430 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:29:30 +0300 Subject: [PATCH 32/71] 1 --- hlna.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index cf16db8..8fea826 100755 --- a/hlna.py +++ b/hlna.py @@ -871,12 +871,13 @@ def rcon(m, c): def rcon_local(m="", c=""): + print_line(f"m {m}",flag="CYAN") + print_line(f"c {c}",flag="CYAN") try: rcon_ports = [] dict_mapname = {} dict_adminpwd = {} for i in list_config: - print_line(i, flag="CYAN") data = read_yaml(i, g="ark") dict_mapname[data['RCONPort']] = data['map'] dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] From 9cbf6268d635e99113a606133109a521e1caf822 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:56:46 +0300 Subject: [PATCH 33/71] 1 --- hlna.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hlna.py b/hlna.py index 8fea826..1e580c3 100755 --- a/hlna.py +++ b/hlna.py @@ -864,22 +864,22 @@ def choose_map(g, m, list_config=list_config): @hlna.command(help='Отправка команд на игровой сервер через rcon ') +@click.option('-g', required=True, help="Название игры для запуска. (ark)") @click.argument('c', nargs=1) @click.option('-m', required=True, help="Название карты для применения rcon команды") -def rcon(m, c): - rcon_local(m, c) +def rcon(g, m, c): + rcon_local(g, m, c) -def rcon_local(m="", c=""): - print_line(f"m {m}",flag="CYAN") - print_line(f"c {c}",flag="CYAN") +def rcon_local(g, m="", c=""): + choose_map(g, m, list_config) try: rcon_ports = [] dict_mapname = {} dict_adminpwd = {} for i in list_config: data = read_yaml(i, g="ark") - dict_mapname[data['RCONPort']] = data['map'] + dict_mapname[data['RCONPort']] = data['SessionName'] dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] if m == "all": print_line(m, flag="CYAN") From 9faa706f12ec285dc428d15af8acb40ec7c1ff93 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 22:57:42 +0300 Subject: [PATCH 34/71] 1 --- hlna.py | 1 - 1 file changed, 1 deletion(-) diff --git a/hlna.py b/hlna.py index 1e580c3..bcfdf94 100755 --- a/hlna.py +++ b/hlna.py @@ -872,7 +872,6 @@ def rcon(g, m, c): def rcon_local(g, m="", c=""): - choose_map(g, m, list_config) try: rcon_ports = [] dict_mapname = {} From 9de6bde5a50a87afef54b0dba99f707f2a06b7b3 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 23:02:56 +0300 Subject: [PATCH 35/71] 1 --- hlna.py | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/hlna.py b/hlna.py index bcfdf94..53d503d 100755 --- a/hlna.py +++ b/hlna.py @@ -872,32 +872,33 @@ def rcon(g, m, c): def rcon_local(g, m="", c=""): - try: - rcon_ports = [] - dict_mapname = {} - dict_adminpwd = {} - for i in list_config: - data = read_yaml(i, g="ark") - dict_mapname[data['RCONPort']] = data['SessionName'] - dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] - if m == "all": - print_line(m, flag="CYAN") - for rcon_p in dict_mapname: - rcon_ports.append(rcon_p) - else: + if g == "ark": + try: + rcon_ports = [] + dict_mapname = {} + dict_adminpwd = {} + for i in list_config: + data = read_yaml(i, g="ark") + dict_mapname[data['RCONPort']] = data['SessionName'] + dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] + # if m == "all": + # print_line(m, flag="CYAN") + # for rcon_p in dict_mapname: + # rcon_ports.append(rcon_p) + # else: for rcon_p, name_map in dict_mapname.items(): if name_map in m: rcon_ports.append(rcon_p) - for port in rcon_ports: - passwd = dict_adminpwd[port] - with Client('127.0.0.1', port, passwd=str(passwd)) as client: - response = client.run(c) - print_line(f"Rcon выполнен {response} {dict_mapname[port]}", flag="GREEN") - else: - pass - except: - print_line(f"Ошибка отправки команды {c} в {m}", flag="RED") + for port in rcon_ports: + passwd = dict_adminpwd[port] + with Client('127.0.0.1', port, passwd=str(passwd)) as client: + response = client.run(c) + print_line(f"Rcon выполнен {response} {dict_mapname[port]}", flag="GREEN") + else: + pass + except: + print_line(f"Ошибка отправки команды {c} в {m}", flag="RED") def zero(x=""): From 7700657e7327ed605483cc1225be7c21bb12f397 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 29 May 2023 23:09:13 +0300 Subject: [PATCH 36/71] 1 --- hlna.py | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/hlna.py b/hlna.py index 53d503d..1859771 100755 --- a/hlna.py +++ b/hlna.py @@ -799,10 +799,11 @@ def start_stop(action, g, m): check_exist_servers(g) name_servers = choose_map(g, m) for i in name_servers: - if action == "stop" or action == "restart": - rcon_local(i, c="SaveWorld") data = read_yaml(i, g="ark", flag=True) + if action == "stop" or action == "restart": + rcon_local(i, "SaveWorld") x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") + if x == 0: print_line(f"Готово {action} для {g} {i}", flag="GREEN") @@ -864,41 +865,39 @@ def choose_map(g, m, list_config=list_config): @hlna.command(help='Отправка команд на игровой сервер через rcon ') -@click.option('-g', required=True, help="Название игры для запуска. (ark)") @click.argument('c', nargs=1) @click.option('-m', required=True, help="Название карты для применения rcon команды") -def rcon(g, m, c): - rcon_local(g, m, c) +def rcon(m, c): + rcon_local(m, c) -def rcon_local(g, m="", c=""): - if g == "ark": - try: +def rcon_local(m, c): + try: + dict_mapname = {} + dict_adminpwd = {} + if list_config: rcon_ports = [] - dict_mapname = {} - dict_adminpwd = {} for i in list_config: data = read_yaml(i, g="ark") - dict_mapname[data['RCONPort']] = data['SessionName'] + dict_mapname[data['RCONPort']] = data['map'] dict_adminpwd[data['RCONPort']] = data['ServerAdminPassword'] - # if m == "all": - # print_line(m, flag="CYAN") - # for rcon_p in dict_mapname: - # rcon_ports.append(rcon_p) - # else: - for rcon_p, name_map in dict_mapname.items(): - if name_map in m: + if m == "all": + for rcon_p in dict_mapname: rcon_ports.append(rcon_p) + else: + for rcon_p, name_map in dict_mapname.items(): + if name_map in m: + rcon_ports.append(rcon_p) for port in rcon_ports: passwd = dict_adminpwd[port] with Client('127.0.0.1', port, passwd=str(passwd)) as client: response = client.run(c) print_line(f"Rcon выполнен {response} {dict_mapname[port]}", flag="GREEN") - else: - pass - except: - print_line(f"Ошибка отправки команды {c} в {m}", flag="RED") + else: + pass + except: + print_line(f"Ошибка отправки команды {c} в {m}", flag="RED") def zero(x=""): From 56a39f2b84facd950db093d474d42f11dd58b497 Mon Sep 17 00:00:00 2001 From: sitisll Date: Tue, 30 May 2023 16:21:19 +0300 Subject: [PATCH 37/71] =?UTF-8?q?rcon=20=D0=B4=D0=BB=D1=8F=20all=20=D0=B2?= =?UTF-8?q?=20restart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/hlna.py b/hlna.py index 1859771..17acbcd 100755 --- a/hlna.py +++ b/hlna.py @@ -784,35 +784,33 @@ def restart(g, m): def check_exist_servers(g): """Проверяет наличие конфигов для активных карт""" - if g == "ark": - if list_config == []: - print_line("Нет сконфигурированных серверов", flag="RED") # добавить отсюда вилку на вопрос с конфигурацией - else: - return + if g == "ark" and not list_config: + print_line("Нет сконфигурированных серверов", flag="RED") # добавить отсюда вилку на вопрос с конфигурацией elif g == "7days": print_line("7Days", flag="CYAN") + else: + return 1 def start_stop(action, g, m): """Функция изменения статусов сервера""" if g == "ark": - check_exist_servers(g) - name_servers = choose_map(g, m) - for i in name_servers: - data = read_yaml(i, g="ark", flag=True) - if action == "stop" or action == "restart": - rcon_local(i, "SaveWorld") - x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") - - if x == 0: - print_line(f"Готово {action} для {g} {i}", flag="GREEN") + x = check_exist_servers(g) + if x: + name_servers = choose_map(g,m) if m !='all' else list_config + print("name_servers=",name_servers) + for i in name_servers: + data = read_yaml(i, g="ark", flag=True) + if action == "stop" or action == "restart": + rcon_local(i, "SaveWorld") + x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") + if x == 0: + print_line(f"Готово {action} для {g} {i}", flag="GREEN") elif g == "7days": x = os.system(f"systemctl --user {action} 7days.service") if x == 0: print_line("Готово", flag="GREEN") - else: - return def read_yaml(list_config=list_config, flag=True, m="", g=""): From 2a5e46a90d840cd0d77671b2c8fe1794c470e3f5 Mon Sep 17 00:00:00 2001 From: sitisll Date: Tue, 30 May 2023 17:31:44 +0300 Subject: [PATCH 38/71] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20choose=5Fmap=20=D0=B8=20=D0=B2=D1=81=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=20=D0=BF=D0=BE=20=D1=87=D1=83=D1=82-=D1=87=D1=83?= =?UTF-8?q?=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 128 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 75 insertions(+), 53 deletions(-) diff --git a/hlna.py b/hlna.py index 17acbcd..d48676a 100755 --- a/hlna.py +++ b/hlna.py @@ -145,6 +145,8 @@ def print_line(*text, flag=""): color = colorama.Fore.GREEN elif flag == "CYAN": color = colorama.Fore.CYAN + else: + color = colorama.Fore.WHITE print(colorama.Fore.YELLOW + "." * 30) print(color, *text) print(colorama.Fore.YELLOW + "." * 30 + colorama.Style.RESET_ALL) @@ -465,6 +467,7 @@ def yaml_create(g, dir_server="", cluster_server="", map_s="", name_server="", p def systemd_unit_create(g, name_server=list_config, config_7days=""): """Создаёт на основании yaml конфига systemd юнит""" + g = g.lower() if g == "ark": id_game = "376030" data = read_yaml(name_server, g="ark") @@ -479,6 +482,8 @@ def systemd_unit_create(g, name_server=list_config, config_7days=""): 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".lower() + else: + print_line("Пока доступно 2 игры: ark и 7Days") unit_text = f'''[Unit] Description={g}: Server @@ -508,8 +513,9 @@ WantedBy=default.target @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', 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": check_exist_servers(g) if not os.path.isdir(dir_mods_ark): @@ -544,10 +550,11 @@ def mod(g, m, i, id_mods_ark): else: print_line("Введите id модов через запятую без пробелов", flag="CYAN") else: - print_line("Не поддерживаемая игра", flag="RED") + print_line("Не поддерживаемая игра, возможно вы иммели ввиду ark?", flag="RED") def modupdate(g, m, id_mod, dir_mod_ark): + g = g.lower() if g == "ark": print_line(f"Проверяем обновление мода {id_mod}", flag="CYAN") with open(os.path.join(dir_mod_ark, f"appworkshop_346110.acf"), "r") as f: @@ -594,6 +601,7 @@ def modupdateall(g, m): def moddownload(g, m, id_mod, dir_mod_ark): """Распаковывает файлы мода и создаёт .mod файл для него""" + g = g.lower() if g == "ark": id_game_workshop = "346110" dir_steam_workshop = f"{dir_workshop_ark}/content/{id_game_workshop}/{id_mod}/WindowsNoEditor" @@ -664,9 +672,10 @@ def moddownload(g, m, id_mod, dir_mod_ark): @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")# переписать эту залупу - else: - 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: - print_line(f"Готов - {i}", flag="GREEN") - #start = "start" if e else "stop" - enable = "enable" if e else "disable" - os.system(f"systemctl --user {enable} ark_{i}") - else: - print_line(f"Ошибка перемещения {i}", flag="RED") - except: - print_line("ошибка операции", flag="RED") + state_config = list_config if e else delist_config + state_msg = "активных" if e else "не активных" + for i in m: + try: + if i in state_config: + print_line(f"Карта {i} уже есть в {state_msg}", flag="CYAN") + continue + data = read_yaml(i, not e) + if e: + data['Port'] = ports(data['Port'], port_s, e) + data['QueryPort'] = ports(data['QueryPort'], port_s, e) + data['RCONPort'] = ports(data['RCONPort'], port_s, e) + 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'], data['ModsId'], data['clusterid'], data['clusterdir'], + data['Listen']) + x = os.system( + f"rm {dir_deactivated}{i} >> {dir_logs}{date} 2>&1") + with open(f"{dir_logs}{date}.log", "a") as f: + f.write(f"[{t}] Сервер {i} перемещён из {state_msg}\n")# переписать эту залупу + else: + 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: + print_line(f"Готов - {i}", flag="GREEN") + #start = "start" if e else "stop" + enable = "enable" if e else "disable" + os.system(f"systemctl --user {enable} ark_{i}") + else: + print_line(f"Ошибка перемещения {i}", flag="RED") + except: + print_line("ошибка операции", flag="RED") @hlna.command(help='Выводит статус настроеных серверов') @@ -763,6 +772,7 @@ def start(g, m): """Запускает сервер выбранной игры""" # добавить проверку на ввод аргумента ark/7day если else: давать подсказку # если нет конфигов, то выводим что серверов нет + g = g.lower() modupdateall(g, m) start_stop("start", g, m) @@ -771,6 +781,7 @@ def start(g, m): @click.option('-g', required=True, help="Название игры для запуска. (ark, 7days") @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def stop(g, m): + g = g.lower() start_stop("stop", g, m) @@ -778,12 +789,14 @@ def stop(g, m): @click.option('-g', required=True, help="Название игры для запуска. (ark, 7days") @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def restart(g, m): + g = g.lower() modupdateall(g, m) start_stop("restart", g, m) def check_exist_servers(g): """Проверяет наличие конфигов для активных карт""" + g = g.lower() if g == "ark" and not list_config: print_line("Нет сконфигурированных серверов", flag="RED") # добавить отсюда вилку на вопрос с конфигурацией elif g == "7days": @@ -794,11 +807,11 @@ def check_exist_servers(g): 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 - print("name_servers=",name_servers) for i in name_servers: data = read_yaml(i, g="ark", flag=True) if action == "stop" or action == "restart": @@ -811,10 +824,13 @@ def start_stop(action, g, m): x = os.system(f"systemctl --user {action} 7days.service") if x == 0: print_line("Готово", flag="GREEN") + else: + print_line("доступные игры: ark и 7days") def read_yaml(list_config=list_config, flag=True, m="", g=""): """Читает конфиги активных или неактивных карт в зависимости от флага и отдаёт данные туда где их запросили""" + g = g.lower() if g == "ark": if m == "all": list_config=list_config @@ -828,6 +844,8 @@ def read_yaml(list_config=list_config, flag=True, m="", g=""): def choose_map(g, m, list_config=list_config): """Функция выбора карт""" + g = g.lower() + new_arr = [] if g == "ark": dict_mapname = {} dict_allmapname = [] @@ -841,25 +859,29 @@ def choose_map(g, m, list_config=list_config): name_servers.append(ns) if list_config != []: # Перенести выше для проверки наличия конфигов if m == "all": - name_servers = dict_allmapname + new_arr = dict_allmapname print_line(f"Выполняется для карт(-ы) {name_servers}", flag="CYAN") else: - name_servers = sorted(name_servers) - print_line('Найдены сервера с этой картой', flag="CYAN") - for i, map in enumerate(name_servers): - print_line(f"{i + 1}) {map}", flag="CYAN") - while True: - try: - x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') - x = [int(i) for i in x] - break - except: - print_line("Неправильный ввод", flag="RED") - for i in x: - name_servers.append(name_servers[i - 1]) - print_line(f"Выбранные сервера: {name_servers}", flag="CYAN") + if name_servers: + name_servers = sorted(name_servers) + print_line('Найдены сервера с этой картой', flag="CYAN") + for i, map in enumerate(name_servers): + print_line(f"{i + 1}) {map}", flag="CYAN") + while True: + try: + x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') + x = [int(i) for i in x] + break + except: + print_line("Неправильный ввод", flag="RED") + print(name_servers) + for i in x: + new_arr.append(name_servers[i - 1]) + print_line(f"Выбранные сервера: {name_servers}", flag="CYAN") + else: + print_line("Не найдено серверов с картой") - return name_servers + return new_arr @hlna.command(help='Отправка команд на игровой сервер через rcon ') From 652a3d0bc44c77f7ea0fc65eb2ab0f2783ba6f74 Mon Sep 17 00:00:00 2001 From: xpamych Date: Tue, 30 May 2023 23:23:01 +0300 Subject: [PATCH 39/71] 1 --- hlna.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hlna.py b/hlna.py index d48676a..c4de94a 100755 --- a/hlna.py +++ b/hlna.py @@ -147,9 +147,9 @@ def print_line(*text, flag=""): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - print(colorama.Fore.YELLOW + "." * 30) + print(colorama.Fore.LIGHTGREEN_EX + "." * 180) print(color, *text) - print(colorama.Fore.YELLOW + "." * 30 + colorama.Style.RESET_ALL) + print(colorama.Fore.LIGHTGREEN_EX + "." * 180 + colorama.Style.RESET_ALL) def check_int(number=""): @@ -744,7 +744,8 @@ def status(list_config=list_config): Порт сервера: {data['Port']} Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} - Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="CYAN") + Максимальное кол-во игроков: {data['MaxPlayers']} + steam://connect/ip:{data['QueryPort']}""", flag="CYAN") if delist_config != []: x = input("Есть неактивные сервера, показать Y/n: ") From 8d9128371fb743145dec47577dcad9d7ccddc8a5 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 20:46:05 +0300 Subject: [PATCH 40/71] 7days --- hlna.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hlna.py b/hlna.py index c4de94a..57edd43 100755 --- a/hlna.py +++ b/hlna.py @@ -696,9 +696,9 @@ def switch(g, m, e): #добавить all data['QueryPort'] = ports(data['QueryPort'], port_s, e) data['RCONPort'] = ports(data['RCONPort'], port_s, e) 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'], data['ModsId'], data['clusterid'], data['clusterdir'], - data['Listen']) + data['QueryPort'], data['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], + data['ServerPassword'], data['MaxPlayers'], data['ModsId'], data['clusterid'], data['clusterdir'], + data['Listen']) x = os.system( f"rm {dir_deactivated}{i} >> {dir_logs}{date} 2>&1") with open(f"{dir_logs}{date}.log", "a") as f: @@ -803,7 +803,7 @@ def check_exist_servers(g): elif g == "7days": print_line("7Days", flag="CYAN") else: - return 1 + return 1 def start_stop(action, g, m): @@ -819,12 +819,12 @@ def start_stop(action, g, m): rcon_local(i, "SaveWorld") x = os.system(f"systemctl --user {action} ark_{data['SessionName'].lower()}.service") if x == 0: - print_line(f"Готово {action} для {g} {i}", flag="GREEN") + print_line(f"Готово {action} для {g} {i}", flag="GREEN") elif g == "7days": x = os.system(f"systemctl --user {action} 7days.service") if x == 0: - print_line("Готово", flag="GREEN") + print_line(f"Готово {action} для {m}", flag="GREEN") else: print_line("доступные игры: ark и 7days") From 7b24d13d7ae20bb8f16ad608859c6332f7932b8e Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 20:49:27 +0300 Subject: [PATCH 41/71] 140 --- hlna.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hlna.py b/hlna.py index 57edd43..26bb407 100755 --- a/hlna.py +++ b/hlna.py @@ -147,9 +147,9 @@ def print_line(*text, flag=""): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - print(colorama.Fore.LIGHTGREEN_EX + "." * 180) + print(colorama.Fore.LIGHTGREEN_EX + "." * 140) print(color, *text) - print(colorama.Fore.LIGHTGREEN_EX + "." * 180 + colorama.Style.RESET_ALL) + print(colorama.Fore.LIGHTGREEN_EX + "." * 140 + colorama.Style.RESET_ALL) def check_int(number=""): From a075e44f31be708c11cd1839ab538fbbc8fb9db7 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:04:02 +0300 Subject: [PATCH 42/71] ext ip --- hlna.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 26bb407..8521d31 100755 --- a/hlna.py +++ b/hlna.py @@ -135,6 +135,11 @@ def unpack(src, dst): logging.info("Archive has been extracted.") +def external_ip(): + ip_ext = requests.get('https://api/ipify.org') + return ip_ext.text + + def print_line(*text, flag=""): """Добавление обводки вокруг текста, покраска""" if flag == "RED": @@ -745,7 +750,7 @@ def status(list_config=list_config): Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} Максимальное кол-во игроков: {data['MaxPlayers']} - steam://connect/ip:{data['QueryPort']}""", flag="CYAN") + steam://connect/{external_ip()}:{data['QueryPort']}""", flag="CYAN") if delist_config != []: x = input("Есть неактивные сервера, показать Y/n: ") From 514d9f1a4ebe2fd20e926ce9eac258d61292b121 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:11:02 +0300 Subject: [PATCH 43/71] 1 --- hlna.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/hlna.py b/hlna.py index 8521d31..343ce14 100755 --- a/hlna.py +++ b/hlna.py @@ -136,8 +136,12 @@ def unpack(src, dst): def external_ip(): - ip_ext = requests.get('https://api/ipify.org') - return ip_ext.text + response = requests.get('https://2ip.ru/') + html = response.text + index = html.find('Ваш IP') + ip = html[index+38:index+53] + print(ip) + def print_line(*text, flag=""): @@ -750,7 +754,7 @@ def status(list_config=list_config): Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} Максимальное кол-во игроков: {data['MaxPlayers']} - steam://connect/{external_ip()}:{data['QueryPort']}""", flag="CYAN") + steam://connect/:{data['QueryPort']}""", flag="CYAN") if delist_config != []: x = input("Есть неактивные сервера, показать Y/n: ") From 255a3027675b4af2b6eca96defa87e18638dff65 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:11:25 +0300 Subject: [PATCH 44/71] 1 --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 343ce14..0ea1b9b 100755 --- a/hlna.py +++ b/hlna.py @@ -142,7 +142,7 @@ def external_ip(): ip = html[index+38:index+53] print(ip) - +external_ip() def print_line(*text, flag=""): """Добавление обводки вокруг текста, покраска""" From da64c93fb80ba5b414d4d1db92f0ae43bf2f0c5e Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:13:11 +0300 Subject: [PATCH 45/71] 1 --- hlna.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/hlna.py b/hlna.py index 0ea1b9b..ae20187 100755 --- a/hlna.py +++ b/hlna.py @@ -135,14 +135,13 @@ def unpack(src, dst): logging.info("Archive has been extracted.") -def external_ip(): - response = requests.get('https://2ip.ru/') - html = response.text - index = html.find('Ваш IP') - ip = html[index+38:index+53] - print(ip) +def get_external_ip(): + response = requests.get('https://api.ipify.org') + return response.text + + +print(get_external_ip()) -external_ip() def print_line(*text, flag=""): """Добавление обводки вокруг текста, покраска""" From 1cb3565b942fa1207ee1e8384fecfe2201f9eafb Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:14:26 +0300 Subject: [PATCH 46/71] 1 --- hlna.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hlna.py b/hlna.py index ae20187..c958d07 100755 --- a/hlna.py +++ b/hlna.py @@ -140,9 +140,6 @@ def get_external_ip(): return response.text -print(get_external_ip()) - - def print_line(*text, flag=""): """Добавление обводки вокруг текста, покраска""" if flag == "RED": @@ -728,6 +725,7 @@ def switch(g, m, e): #добавить all @hlna.command(help='Выводит статус настроеных серверов') def status(list_config=list_config): + ext_ip = get_external_ip() if list_config == [] and delist_config == []: print_line("Сервера не сконфигурированы", flag="RED") else: @@ -753,7 +751,7 @@ def status(list_config=list_config): Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} Максимальное кол-во игроков: {data['MaxPlayers']} - steam://connect/:{data['QueryPort']}""", flag="CYAN") + steam://connect/{ext_ip}:{data['QueryPort']}""", flag="CYAN") if delist_config != []: x = input("Есть неактивные сервера, показать Y/n: ") From 25f75b3d2a7a9dc563ae6f9900d75deebf4070b6 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:18:11 +0300 Subject: [PATCH 47/71] len_text --- hlna.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hlna.py b/hlna.py index c958d07..1b3d612 100755 --- a/hlna.py +++ b/hlna.py @@ -152,9 +152,10 @@ def print_line(*text, flag=""): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - print(colorama.Fore.LIGHTGREEN_EX + "." * 140) + len_text = len(text) + print(colorama.Fore.LIGHTGREEN_EX + "." * len_text) print(color, *text) - print(colorama.Fore.LIGHTGREEN_EX + "." * 140 + colorama.Style.RESET_ALL) + print(colorama.Fore.LIGHTGREEN_EX + "." * len_text + colorama.Style.RESET_ALL) def check_int(number=""): From 56e52d55d4e1eaaa08f237ee45cb61ed6b1bd7e6 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:21:12 +0300 Subject: [PATCH 48/71] 1 --- hlna.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hlna.py b/hlna.py index 1b3d612..ad62350 100755 --- a/hlna.py +++ b/hlna.py @@ -752,7 +752,7 @@ def status(list_config=list_config): Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} Максимальное кол-во игроков: {data['MaxPlayers']} - steam://connect/{ext_ip}:{data['QueryPort']}""", flag="CYAN") + steam://connect/{ext_ip}:{data['QueryPort']}""", flag="GREEN") if delist_config != []: x = input("Есть неактивные сервера, показать Y/n: ") @@ -770,7 +770,7 @@ def status(list_config=list_config): Порт сервера: {data['Port']} Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} - Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="CYAN") + Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="RED") @hlna.command(help='Запуск, сконфигурированного сервера или кластера ') From 785edb0f4955257a0e551b0a66e782b415c27086 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 31 May 2023 21:31:57 +0300 Subject: [PATCH 49/71] 1 --- hlna.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hlna.py b/hlna.py index ad62350..dbcf592 100755 --- a/hlna.py +++ b/hlna.py @@ -752,7 +752,7 @@ def status(list_config=list_config): Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} Максимальное кол-во игроков: {data['MaxPlayers']} - steam://connect/{ext_ip}:{data['QueryPort']}""", flag="GREEN") + steam://connect/{ext_ip}:{data['QueryPort']}""", flag="CYAN") if delist_config != []: x = input("Есть неактивные сервера, показать Y/n: ") @@ -770,7 +770,7 @@ def status(list_config=list_config): Порт сервера: {data['Port']} Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} - Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="RED") + Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="YELLOW") @hlna.command(help='Запуск, сконфигурированного сервера или кластера ') @@ -781,7 +781,8 @@ def start(g, m): # добавить проверку на ввод аргумента ark/7day если else: давать подсказку # если нет конфигов, то выводим что серверов нет g = g.lower() - modupdateall(g, m) + if g == "ark": + modupdateall(g, m) start_stop("start", g, m) @@ -790,6 +791,8 @@ def start(g, m): @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def stop(g, m): g = g.lower() + if g == "ark": + modupdateall(g, m) start_stop("stop", g, m) @@ -798,7 +801,8 @@ def stop(g, m): @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def restart(g, m): g = g.lower() - modupdateall(g, m) + if g == "ark": + modupdateall(g, m) start_stop("restart", g, m) From 1bc39cc5e747d2489ec85ad7538e6ba98f16cc8e Mon Sep 17 00:00:00 2001 From: sitisll Date: Thu, 1 Jun 2023 13:37:16 +0300 Subject: [PATCH 50/71] backup --- ark_backup13_17_31.zip | Bin 0 -> 1011 bytes ark_backup13_17_46.zip | Bin 0 -> 1011 bytes ark_backup13_25_07.zip | Bin 0 -> 1011 bytes ark_backup13_27_48.zip | Bin 0 -> 1176 bytes ark_backup13_28_59.zip | Bin 0 -> 1176 bytes ark_backup13_29_35.zip | Bin 0 -> 1176 bytes hlna.py | 41 ++++++++++++++++++++++++++++++++++------- 7 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 ark_backup13_17_31.zip create mode 100644 ark_backup13_17_46.zip create mode 100644 ark_backup13_25_07.zip create mode 100644 ark_backup13_27_48.zip create mode 100644 ark_backup13_28_59.zip create mode 100644 ark_backup13_29_35.zip diff --git a/ark_backup13_17_31.zip b/ark_backup13_17_31.zip new file mode 100644 index 0000000000000000000000000000000000000000..ebb5b6cd4f2d490b2e902556e4c69ab392a33ad2 GIT binary patch literal 1011 zcmWIWW@Zs#U|`^2kV-ljrad`%&p{y1nUR4(4M=C?=cei>8XD^BCFkd*Wv1(ABKV-nu`u-2seT#(wUg0NrLuD>Bl=j#QbS!ntntaml=8x~i z8XJW7MZB-}KmUnk)wbsyOB93pl^fOyznou`UibQ1%)|(1OJ9YEdl9^kH+EPBh{Wj` z3C_2@RI0GKXqGOk?5h61w`K=-f4e#3hV9hnm5NWeUp8&oH23q?#DAP$UdYc8H!zb5 z5w;3ZJAK6=axLHcS7J$J2jBa)OFc6Zv|Ofpud?E%RaNMQ3hnMk_Af8Jl=l8^{dw)f z8wss(doIcczym>}XJ1%;)Ykc%fu2_e27)r)KnTf5^(@Xw%u6Xfznc#j0<0J2uK#eX zwgJvo0e){qIk}V2io9-q*_mVq!$23Sdd&dG{DTXz3Y~CQ&A#PiuZ6LPvrxvsv5&L(vQ;BA7@VTQxg4rx9s7^Cnsv8qhD{| zq~pC@|GP6`#yYRzUt>BoN<=t$B*i6jdgF{&AWGQiL%G(wrmwvQ&S6uh}#0O z^5(xLPXE<;ge&DrlldG;*29S$JC|GSn9?oqjrY>#$s2o;BwtK;x6OO`dDU5UN!jzS zsmxJuUm_ipr1iS!Y|ZyCbMM~;`ZPd+D}LdHLLIBri85i2Vw1Mr%Pno?x-i3G`n%=F zF6}S>Jadj;z3=V3n&{ozE`_r$XEN5?YTPUy;LXS+!i+n)13eA~OBz8Gafu(l15fw*y1)5o|cde#1=IO1ApQ*5ExMb-mGjO<;+0%0Z6}P0`UO+XMPR< literal 0 HcmV?d00001 diff --git a/ark_backup13_17_46.zip b/ark_backup13_17_46.zip new file mode 100644 index 0000000000000000000000000000000000000000..ebb5b6cd4f2d490b2e902556e4c69ab392a33ad2 GIT binary patch literal 1011 zcmWIWW@Zs#U|`^2kV-ljrad`%&p{y1nUR4(4M=C?=cei>8XD^BCFkd*Wv1(ABKV-nu`u-2seT#(wUg0NrLuD>Bl=j#QbS!ntntaml=8x~i z8XJW7MZB-}KmUnk)wbsyOB93pl^fOyznou`UibQ1%)|(1OJ9YEdl9^kH+EPBh{Wj` z3C_2@RI0GKXqGOk?5h61w`K=-f4e#3hV9hnm5NWeUp8&oH23q?#DAP$UdYc8H!zb5 z5w;3ZJAK6=axLHcS7J$J2jBa)OFc6Zv|Ofpud?E%RaNMQ3hnMk_Af8Jl=l8^{dw)f z8wss(doIcczym>}XJ1%;)Ykc%fu2_e27)r)KnTf5^(@Xw%u6Xfznc#j0<0J2uK#eX zwgJvo0e){qIk}V2io9-q*_mVq!$23Sdd&dG{DTXz3Y~CQ&A#PiuZ6LPvrxvsv5&L(vQ;BA7@VTQxg4rx9s7^Cnsv8qhD{| zq~pC@|GP6`#yYRzUt>BoN<=t$B*i6jdgF{&AWGQiL%G(wrmwvQ&S6uh}#0O z^5(xLPXE<;ge&DrlldG;*29S$JC|GSn9?oqjrY>#$s2o;BwtK;x6OO`dDU5UN!jzS zsmxJuUm_ipr1iS!Y|ZyCbMM~;`ZPd+D}LdHLLIBri85i2Vw1Mr%Pno?x-i3G`n%=F zF6}S>Jadj;z3=V3n&{ozE`_r$XEN5?YTPUy;LXS+!i+n)13eA~OBz8Gafu(l15fw*y1)5o|cde#1=IO1ApQ*5ExMb-mGjO<;+0%0Z6}P0`UO+XMPR< literal 0 HcmV?d00001 diff --git a/ark_backup13_25_07.zip b/ark_backup13_25_07.zip new file mode 100644 index 0000000000000000000000000000000000000000..ebb5b6cd4f2d490b2e902556e4c69ab392a33ad2 GIT binary patch literal 1011 zcmWIWW@Zs#U|`^2kV-ljrad`%&p{y1nUR4(4M=C?=cei>8XD^BCFkd*Wv1(ABKV-nu`u-2seT#(wUg0NrLuD>Bl=j#QbS!ntntaml=8x~i z8XJW7MZB-}KmUnk)wbsyOB93pl^fOyznou`UibQ1%)|(1OJ9YEdl9^kH+EPBh{Wj` z3C_2@RI0GKXqGOk?5h61w`K=-f4e#3hV9hnm5NWeUp8&oH23q?#DAP$UdYc8H!zb5 z5w;3ZJAK6=axLHcS7J$J2jBa)OFc6Zv|Ofpud?E%RaNMQ3hnMk_Af8Jl=l8^{dw)f z8wss(doIcczym>}XJ1%;)Ykc%fu2_e27)r)KnTf5^(@Xw%u6Xfznc#j0<0J2uK#eX zwgJvo0e){qIk}V2io9-q*_mVq!$23Sdd&dG{DTXz3Y~CQ&A#PiuZ6LPvrxvsv5&L(vQ;BA7@VTQxg4rx9s7^Cnsv8qhD{| zq~pC@|GP6`#yYRzUt>BoN<=t$B*i6jdgF{&AWGQiL%G(wrmwvQ&S6uh}#0O z^5(xLPXE<;ge&DrlldG;*29S$JC|GSn9?oqjrY>#$s2o;BwtK;x6OO`dDU5UN!jzS zsmxJuUm_ipr1iS!Y|ZyCbMM~;`ZPd+D}LdHLLIBri85i2Vw1Mr%Pno?x-i3G`n%=F zF6}S>Jadj;z3=V3n&{ozE`_r$XEN5?YTPUy;LXS+!i+n)13eA~OBz8Gafu(l15fw*y1)5o|cde#1=IO1ApQ*5ExMb-mGjO<;+0%0Z6}P0`UO+XMPR< literal 0 HcmV?d00001 diff --git a/ark_backup13_27_48.zip b/ark_backup13_27_48.zip new file mode 100644 index 0000000000000000000000000000000000000000..9f53101f6b4c83b854136af7f3d2d11dfdb4c6d6 GIT binary patch literal 1176 zcmWIWW@Zs#U|`^2knPzQ*8j=YQW3~g0%92;&dASA)lW1u)YnVS&r8cp*U!kwOVo$3 zFNbP)=$!1(_tVw#*4-3z;rxm7zE}NCOs?>=b&I?%W@HF}8!eS|Fid-L@}7f0Bb^x; z7}RhY?HJ^(Zvq4*sl_EAy0qUh|BwMs>-#@k_bnC%c!i(f4VAgjP}*ZJ(6Q7lYw}6I zn?Jr6YitnS7xBK@|NJMGRok9-EKv;VS8iA<{BnL#dfn@5F%u)4EqxUt?nUrE-q>Lk zAQGo%BskypQmMk`qFK7Eva9<4-kKfU{q5$A8@5xQS1LZ?e%Z8T)7;Nn6aR63c_BYX z+`vpKMA#}s?erCg$hCa$Ux_7^9enTGF7?bv&~lmXy~>K4R#l-JDzv*F*}uH>Qri2w z_2;z@ZzQzF?YStA2m}pa_~u7#oxd6Ad1YWADB}%;kc?E%;+(|1l+yFN`G6t7dSUMR z564iZ+;wHasep-xOhV^&%@WoA8Yi^zVE#rW-s6*| zJ-RU4!lImA`gCn9|F_`yhhM)R=SKKh7#Q(icPLBl1p3tq=x15HeojpR`t~$mlYs#1 zg}w2H*5S(*T+AwO*`cuS!$;<;eon#}XL)}7sP5KS_vYQad*_xYdz@~|R$(omH2V zJ^z}@90m6!(m_dDuZzyseE%}{{#~F?0~EO87hWjTu}YmN6ZR-JY1_Tr(pIhuGaRPB zTYl`){_@W==lIq8-p;Fu-o5QoIO}pIW4*1$&Ef&xj7%cTxN{QF<6y9)5k%q3SI8z| z%Qz5o7#Nl`M&mRIJsTmLi7g!>%uE2r5_Z>t%!H>(WCO89GQz+RCVU10qddTyl?|kv N1qeZD#Df{c0|29PsK@{S literal 0 HcmV?d00001 diff --git a/ark_backup13_28_59.zip b/ark_backup13_28_59.zip new file mode 100644 index 0000000000000000000000000000000000000000..9f53101f6b4c83b854136af7f3d2d11dfdb4c6d6 GIT binary patch literal 1176 zcmWIWW@Zs#U|`^2knPzQ*8j=YQW3~g0%92;&dASA)lW1u)YnVS&r8cp*U!kwOVo$3 zFNbP)=$!1(_tVw#*4-3z;rxm7zE}NCOs?>=b&I?%W@HF}8!eS|Fid-L@}7f0Bb^x; z7}RhY?HJ^(Zvq4*sl_EAy0qUh|BwMs>-#@k_bnC%c!i(f4VAgjP}*ZJ(6Q7lYw}6I zn?Jr6YitnS7xBK@|NJMGRok9-EKv;VS8iA<{BnL#dfn@5F%u)4EqxUt?nUrE-q>Lk zAQGo%BskypQmMk`qFK7Eva9<4-kKfU{q5$A8@5xQS1LZ?e%Z8T)7;Nn6aR63c_BYX z+`vpKMA#}s?erCg$hCa$Ux_7^9enTGF7?bv&~lmXy~>K4R#l-JDzv*F*}uH>Qri2w z_2;z@ZzQzF?YStA2m}pa_~u7#oxd6Ad1YWADB}%;kc?E%;+(|1l+yFN`G6t7dSUMR z564iZ+;wHasep-xOhV^&%@WoA8Yi^zVE#rW-s6*| zJ-RU4!lImA`gCn9|F_`yhhM)R=SKKh7#Q(icPLBl1p3tq=x15HeojpR`t~$mlYs#1 zg}w2H*5S(*T+AwO*`cuS!$;<;eon#}XL)}7sP5KS_vYQad*_xYdz@~|R$(omH2V zJ^z}@90m6!(m_dDuZzyseE%}{{#~F?0~EO87hWjTu}YmN6ZR-JY1_Tr(pIhuGaRPB zTYl`){_@W==lIq8-p;Fu-o5QoIO}pIW4*1$&Ef&xj7%cTxN{QF<6y9)5k%q3SI8z| z%Qz5o7#Nl`M&mRIJsTmLi7g!>%uE2r5_Z>t%!H>(WCO89GQz+RCVU10qddTyl?|kv N1qeZD#Df{c0|29PsK@{S literal 0 HcmV?d00001 diff --git a/ark_backup13_29_35.zip b/ark_backup13_29_35.zip new file mode 100644 index 0000000000000000000000000000000000000000..9f53101f6b4c83b854136af7f3d2d11dfdb4c6d6 GIT binary patch literal 1176 zcmWIWW@Zs#U|`^2knPzQ*8j=YQW3~g0%92;&dASA)lW1u)YnVS&r8cp*U!kwOVo$3 zFNbP)=$!1(_tVw#*4-3z;rxm7zE}NCOs?>=b&I?%W@HF}8!eS|Fid-L@}7f0Bb^x; z7}RhY?HJ^(Zvq4*sl_EAy0qUh|BwMs>-#@k_bnC%c!i(f4VAgjP}*ZJ(6Q7lYw}6I zn?Jr6YitnS7xBK@|NJMGRok9-EKv;VS8iA<{BnL#dfn@5F%u)4EqxUt?nUrE-q>Lk zAQGo%BskypQmMk`qFK7Eva9<4-kKfU{q5$A8@5xQS1LZ?e%Z8T)7;Nn6aR63c_BYX z+`vpKMA#}s?erCg$hCa$Ux_7^9enTGF7?bv&~lmXy~>K4R#l-JDzv*F*}uH>Qri2w z_2;z@ZzQzF?YStA2m}pa_~u7#oxd6Ad1YWADB}%;kc?E%;+(|1l+yFN`G6t7dSUMR z564iZ+;wHasep-xOhV^&%@WoA8Yi^zVE#rW-s6*| zJ-RU4!lImA`gCn9|F_`yhhM)R=SKKh7#Q(icPLBl1p3tq=x15HeojpR`t~$mlYs#1 zg}w2H*5S(*T+AwO*`cuS!$;<;eon#}XL)}7sP5KS_vYQad*_xYdz@~|R$(omH2V zJ^z}@90m6!(m_dDuZzyseE%}{{#~F?0~EO87hWjTu}YmN6ZR-JY1_Tr(pIhuGaRPB zTYl`){_@W==lIq8-p;Fu-o5QoIO}pIW4*1$&Ef&xj7%cTxN{QF<6y9)5k%q3SI8z| z%Qz5o7#Nl`M&mRIJsTmLi7g!>%uE2r5_Z>t%!H>(WCO89GQz+RCVU10qddTyl?|kv N1qeZD#Df{c0|29PsK@{S literal 0 HcmV?d00001 diff --git a/hlna.py b/hlna.py index dbcf592..aa7f6cc 100755 --- a/hlna.py +++ b/hlna.py @@ -3,6 +3,7 @@ import os import re import sys import zlib +import time import struct import logging import datetime @@ -11,13 +12,14 @@ import subprocess import yaml import click +import zipfile import colorama -import hlnaui - from pathlib import Path -from rcon.source import Client from PyQt6 import QtWidgets +from rcon.source import Client + +import hlnaui home_dir = Path.home() @@ -63,6 +65,32 @@ def hlna(): pass +@hlna.command(help='Бэкап серверов выбранной игры ') +@click.argument('g', nargs=1) +def backup(g): + if g == "ark": + source = [f"{dir_config}"] + backup_path = input("Введите конечный путь для бэкапа, по умолчанию ******") + if not backup_path: + backup_path = "/home/a11" + + today= backup_path + os.sep + time.strftime('%Y_%m_%d') + target = f"{backup_path}/" + g + "_backup-"+ time.strftime('%H_%M_%S') + '.zip' + create_dir(backup_path) + with zipfile.ZipFile(target, 'w', zipfile.ZIP_DEFLATED, True) as myzip: + for source_folder in source: + for root,dirs,files in os.walk(source_folder): + for file in files: + path = os.path.join(root, file) + myzip.write(path) + print(path, colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL ) + print(colorama.Fore.GREEN + f"Конфиги сохранены в {target}" + colorama.Style.RESET_ALL ) + elif g == "7days": + pass + else: + print("Поддерживает только ark и 7days") + + def unpack(src, dst): """Добавить документацию""" with open(src, 'rb') as f: @@ -140,7 +168,7 @@ def get_external_ip(): return response.text -def print_line(*text, flag=""): +def print_line(*text, flag="", sep=" ", end="\n"): """Добавление обводки вокруг текста, покраска""" if flag == "RED": color = colorama.Fore.RED @@ -154,7 +182,7 @@ def print_line(*text, flag=""): color = colorama.Fore.WHITE len_text = len(text) print(colorama.Fore.LIGHTGREEN_EX + "." * len_text) - print(color, *text) + print(color, *text, sep=sep, end=end) print(colorama.Fore.LIGHTGREEN_EX + "." * len_text + colorama.Style.RESET_ALL) @@ -778,7 +806,7 @@ def status(list_config=list_config): @click.option('-m', default='all', help="Название карты для запуска или all для запуска все карт") def start(g, m): """Запускает сервер выбранной игры""" - # добавить проверку на ввод аргумента ark/7day если else: давать подсказку + # добавить проверку на ввод аргумента ark/7days если else: давать подсказку # если нет конфигов, то выводим что серверов нет g = g.lower() if g == "ark": @@ -936,7 +964,6 @@ def zero(x=""): """Потом пригодится (нет)""" return "" - if not os.path.exists(dir_config + "config"): dir_server = path_server() else: From 639310525316245107f77fa5fc3465cc05842d7a Mon Sep 17 00:00:00 2001 From: sitisll Date: Thu, 1 Jun 2023 13:39:44 +0300 Subject: [PATCH 51/71] backup --- ark_backup13_17_31.zip | Bin 1011 -> 0 bytes ark_backup13_17_46.zip | Bin 1011 -> 0 bytes ark_backup13_25_07.zip | Bin 1011 -> 0 bytes ark_backup13_27_48.zip | Bin 1176 -> 0 bytes ark_backup13_28_59.zip | Bin 1176 -> 0 bytes ark_backup13_29_35.zip | Bin 1176 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ark_backup13_17_31.zip delete mode 100644 ark_backup13_17_46.zip delete mode 100644 ark_backup13_25_07.zip delete mode 100644 ark_backup13_27_48.zip delete mode 100644 ark_backup13_28_59.zip delete mode 100644 ark_backup13_29_35.zip diff --git a/ark_backup13_17_31.zip b/ark_backup13_17_31.zip deleted file mode 100644 index ebb5b6cd4f2d490b2e902556e4c69ab392a33ad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmWIWW@Zs#U|`^2kV-ljrad`%&p{y1nUR4(4M=C?=cei>8XD^BCFkd*Wv1(ABKV-nu`u-2seT#(wUg0NrLuD>Bl=j#QbS!ntntaml=8x~i z8XJW7MZB-}KmUnk)wbsyOB93pl^fOyznou`UibQ1%)|(1OJ9YEdl9^kH+EPBh{Wj` z3C_2@RI0GKXqGOk?5h61w`K=-f4e#3hV9hnm5NWeUp8&oH23q?#DAP$UdYc8H!zb5 z5w;3ZJAK6=axLHcS7J$J2jBa)OFc6Zv|Ofpud?E%RaNMQ3hnMk_Af8Jl=l8^{dw)f z8wss(doIcczym>}XJ1%;)Ykc%fu2_e27)r)KnTf5^(@Xw%u6Xfznc#j0<0J2uK#eX zwgJvo0e){qIk}V2io9-q*_mVq!$23Sdd&dG{DTXz3Y~CQ&A#PiuZ6LPvrxvsv5&L(vQ;BA7@VTQxg4rx9s7^Cnsv8qhD{| zq~pC@|GP6`#yYRzUt>BoN<=t$B*i6jdgF{&AWGQiL%G(wrmwvQ&S6uh}#0O z^5(xLPXE<;ge&DrlldG;*29S$JC|GSn9?oqjrY>#$s2o;BwtK;x6OO`dDU5UN!jzS zsmxJuUm_ipr1iS!Y|ZyCbMM~;`ZPd+D}LdHLLIBri85i2Vw1Mr%Pno?x-i3G`n%=F zF6}S>Jadj;z3=V3n&{ozE`_r$XEN5?YTPUy;LXS+!i+n)13eA~OBz8Gafu(l15fw*y1)5o|cde#1=IO1ApQ*5ExMb-mGjO<;+0%0Z6}P0`UO+XMPR< diff --git a/ark_backup13_17_46.zip b/ark_backup13_17_46.zip deleted file mode 100644 index ebb5b6cd4f2d490b2e902556e4c69ab392a33ad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmWIWW@Zs#U|`^2kV-ljrad`%&p{y1nUR4(4M=C?=cei>8XD^BCFkd*Wv1(ABKV-nu`u-2seT#(wUg0NrLuD>Bl=j#QbS!ntntaml=8x~i z8XJW7MZB-}KmUnk)wbsyOB93pl^fOyznou`UibQ1%)|(1OJ9YEdl9^kH+EPBh{Wj` z3C_2@RI0GKXqGOk?5h61w`K=-f4e#3hV9hnm5NWeUp8&oH23q?#DAP$UdYc8H!zb5 z5w;3ZJAK6=axLHcS7J$J2jBa)OFc6Zv|Ofpud?E%RaNMQ3hnMk_Af8Jl=l8^{dw)f z8wss(doIcczym>}XJ1%;)Ykc%fu2_e27)r)KnTf5^(@Xw%u6Xfznc#j0<0J2uK#eX zwgJvo0e){qIk}V2io9-q*_mVq!$23Sdd&dG{DTXz3Y~CQ&A#PiuZ6LPvrxvsv5&L(vQ;BA7@VTQxg4rx9s7^Cnsv8qhD{| zq~pC@|GP6`#yYRzUt>BoN<=t$B*i6jdgF{&AWGQiL%G(wrmwvQ&S6uh}#0O z^5(xLPXE<;ge&DrlldG;*29S$JC|GSn9?oqjrY>#$s2o;BwtK;x6OO`dDU5UN!jzS zsmxJuUm_ipr1iS!Y|ZyCbMM~;`ZPd+D}LdHLLIBri85i2Vw1Mr%Pno?x-i3G`n%=F zF6}S>Jadj;z3=V3n&{ozE`_r$XEN5?YTPUy;LXS+!i+n)13eA~OBz8Gafu(l15fw*y1)5o|cde#1=IO1ApQ*5ExMb-mGjO<;+0%0Z6}P0`UO+XMPR< diff --git a/ark_backup13_25_07.zip b/ark_backup13_25_07.zip deleted file mode 100644 index ebb5b6cd4f2d490b2e902556e4c69ab392a33ad2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmWIWW@Zs#U|`^2kV-ljrad`%&p{y1nUR4(4M=C?=cei>8XD^BCFkd*Wv1(ABKV-nu`u-2seT#(wUg0NrLuD>Bl=j#QbS!ntntaml=8x~i z8XJW7MZB-}KmUnk)wbsyOB93pl^fOyznou`UibQ1%)|(1OJ9YEdl9^kH+EPBh{Wj` z3C_2@RI0GKXqGOk?5h61w`K=-f4e#3hV9hnm5NWeUp8&oH23q?#DAP$UdYc8H!zb5 z5w;3ZJAK6=axLHcS7J$J2jBa)OFc6Zv|Ofpud?E%RaNMQ3hnMk_Af8Jl=l8^{dw)f z8wss(doIcczym>}XJ1%;)Ykc%fu2_e27)r)KnTf5^(@Xw%u6Xfznc#j0<0J2uK#eX zwgJvo0e){qIk}V2io9-q*_mVq!$23Sdd&dG{DTXz3Y~CQ&A#PiuZ6LPvrxvsv5&L(vQ;BA7@VTQxg4rx9s7^Cnsv8qhD{| zq~pC@|GP6`#yYRzUt>BoN<=t$B*i6jdgF{&AWGQiL%G(wrmwvQ&S6uh}#0O z^5(xLPXE<;ge&DrlldG;*29S$JC|GSn9?oqjrY>#$s2o;BwtK;x6OO`dDU5UN!jzS zsmxJuUm_ipr1iS!Y|ZyCbMM~;`ZPd+D}LdHLLIBri85i2Vw1Mr%Pno?x-i3G`n%=F zF6}S>Jadj;z3=V3n&{ozE`_r$XEN5?YTPUy;LXS+!i+n)13eA~OBz8Gafu(l15fw*y1)5o|cde#1=IO1ApQ*5ExMb-mGjO<;+0%0Z6}P0`UO+XMPR< diff --git a/ark_backup13_27_48.zip b/ark_backup13_27_48.zip deleted file mode 100644 index 9f53101f6b4c83b854136af7f3d2d11dfdb4c6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmWIWW@Zs#U|`^2knPzQ*8j=YQW3~g0%92;&dASA)lW1u)YnVS&r8cp*U!kwOVo$3 zFNbP)=$!1(_tVw#*4-3z;rxm7zE}NCOs?>=b&I?%W@HF}8!eS|Fid-L@}7f0Bb^x; z7}RhY?HJ^(Zvq4*sl_EAy0qUh|BwMs>-#@k_bnC%c!i(f4VAgjP}*ZJ(6Q7lYw}6I zn?Jr6YitnS7xBK@|NJMGRok9-EKv;VS8iA<{BnL#dfn@5F%u)4EqxUt?nUrE-q>Lk zAQGo%BskypQmMk`qFK7Eva9<4-kKfU{q5$A8@5xQS1LZ?e%Z8T)7;Nn6aR63c_BYX z+`vpKMA#}s?erCg$hCa$Ux_7^9enTGF7?bv&~lmXy~>K4R#l-JDzv*F*}uH>Qri2w z_2;z@ZzQzF?YStA2m}pa_~u7#oxd6Ad1YWADB}%;kc?E%;+(|1l+yFN`G6t7dSUMR z564iZ+;wHasep-xOhV^&%@WoA8Yi^zVE#rW-s6*| zJ-RU4!lImA`gCn9|F_`yhhM)R=SKKh7#Q(icPLBl1p3tq=x15HeojpR`t~$mlYs#1 zg}w2H*5S(*T+AwO*`cuS!$;<;eon#}XL)}7sP5KS_vYQad*_xYdz@~|R$(omH2V zJ^z}@90m6!(m_dDuZzyseE%}{{#~F?0~EO87hWjTu}YmN6ZR-JY1_Tr(pIhuGaRPB zTYl`){_@W==lIq8-p;Fu-o5QoIO}pIW4*1$&Ef&xj7%cTxN{QF<6y9)5k%q3SI8z| z%Qz5o7#Nl`M&mRIJsTmLi7g!>%uE2r5_Z>t%!H>(WCO89GQz+RCVU10qddTyl?|kv N1qeZD#Df{c0|29PsK@{S diff --git a/ark_backup13_28_59.zip b/ark_backup13_28_59.zip deleted file mode 100644 index 9f53101f6b4c83b854136af7f3d2d11dfdb4c6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmWIWW@Zs#U|`^2knPzQ*8j=YQW3~g0%92;&dASA)lW1u)YnVS&r8cp*U!kwOVo$3 zFNbP)=$!1(_tVw#*4-3z;rxm7zE}NCOs?>=b&I?%W@HF}8!eS|Fid-L@}7f0Bb^x; z7}RhY?HJ^(Zvq4*sl_EAy0qUh|BwMs>-#@k_bnC%c!i(f4VAgjP}*ZJ(6Q7lYw}6I zn?Jr6YitnS7xBK@|NJMGRok9-EKv;VS8iA<{BnL#dfn@5F%u)4EqxUt?nUrE-q>Lk zAQGo%BskypQmMk`qFK7Eva9<4-kKfU{q5$A8@5xQS1LZ?e%Z8T)7;Nn6aR63c_BYX z+`vpKMA#}s?erCg$hCa$Ux_7^9enTGF7?bv&~lmXy~>K4R#l-JDzv*F*}uH>Qri2w z_2;z@ZzQzF?YStA2m}pa_~u7#oxd6Ad1YWADB}%;kc?E%;+(|1l+yFN`G6t7dSUMR z564iZ+;wHasep-xOhV^&%@WoA8Yi^zVE#rW-s6*| zJ-RU4!lImA`gCn9|F_`yhhM)R=SKKh7#Q(icPLBl1p3tq=x15HeojpR`t~$mlYs#1 zg}w2H*5S(*T+AwO*`cuS!$;<;eon#}XL)}7sP5KS_vYQad*_xYdz@~|R$(omH2V zJ^z}@90m6!(m_dDuZzyseE%}{{#~F?0~EO87hWjTu}YmN6ZR-JY1_Tr(pIhuGaRPB zTYl`){_@W==lIq8-p;Fu-o5QoIO}pIW4*1$&Ef&xj7%cTxN{QF<6y9)5k%q3SI8z| z%Qz5o7#Nl`M&mRIJsTmLi7g!>%uE2r5_Z>t%!H>(WCO89GQz+RCVU10qddTyl?|kv N1qeZD#Df{c0|29PsK@{S diff --git a/ark_backup13_29_35.zip b/ark_backup13_29_35.zip deleted file mode 100644 index 9f53101f6b4c83b854136af7f3d2d11dfdb4c6d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1176 zcmWIWW@Zs#U|`^2knPzQ*8j=YQW3~g0%92;&dASA)lW1u)YnVS&r8cp*U!kwOVo$3 zFNbP)=$!1(_tVw#*4-3z;rxm7zE}NCOs?>=b&I?%W@HF}8!eS|Fid-L@}7f0Bb^x; z7}RhY?HJ^(Zvq4*sl_EAy0qUh|BwMs>-#@k_bnC%c!i(f4VAgjP}*ZJ(6Q7lYw}6I zn?Jr6YitnS7xBK@|NJMGRok9-EKv;VS8iA<{BnL#dfn@5F%u)4EqxUt?nUrE-q>Lk zAQGo%BskypQmMk`qFK7Eva9<4-kKfU{q5$A8@5xQS1LZ?e%Z8T)7;Nn6aR63c_BYX z+`vpKMA#}s?erCg$hCa$Ux_7^9enTGF7?bv&~lmXy~>K4R#l-JDzv*F*}uH>Qri2w z_2;z@ZzQzF?YStA2m}pa_~u7#oxd6Ad1YWADB}%;kc?E%;+(|1l+yFN`G6t7dSUMR z564iZ+;wHasep-xOhV^&%@WoA8Yi^zVE#rW-s6*| zJ-RU4!lImA`gCn9|F_`yhhM)R=SKKh7#Q(icPLBl1p3tq=x15HeojpR`t~$mlYs#1 zg}w2H*5S(*T+AwO*`cuS!$;<;eon#}XL)}7sP5KS_vYQad*_xYdz@~|R$(omH2V zJ^z}@90m6!(m_dDuZzyseE%}{{#~F?0~EO87hWjTu}YmN6ZR-JY1_Tr(pIhuGaRPB zTYl`){_@W==lIq8-p;Fu-o5QoIO}pIW4*1$&Ef&xj7%cTxN{QF<6y9)5k%q3SI8z| z%Qz5o7#Nl`M&mRIJsTmLi7g!>%uE2r5_Z>t%!H>(WCO89GQz+RCVU10qddTyl?|kv N1qeZD#Df{c0|29PsK@{S From 79e65d80fa57767b438bc382e237b96b9a321ca7 Mon Sep 17 00:00:00 2001 From: sitisll Date: Thu, 1 Jun 2023 14:08:49 +0300 Subject: [PATCH 52/71] restore backup --- hlna.py | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index aa7f6cc..bc0adc8 100755 --- a/hlna.py +++ b/hlna.py @@ -65,7 +65,33 @@ def hlna(): pass -@hlna.command(help='Бэкап серверов выбранной игры ') +@hlna.command(help='Восстановление бэкапов серверов в ') +@click.argument('g', nargs=1) +@click.option('-d',required=True , help="Путь до zip архива") +def restore(g,d): + directory_to_extract_to = "*******" + "Получение пути к файлам внутри архива, может понадобиться при раскидывании по местам" + "===================================================================================" + #zip_file = zipfile.ZipFile(d) + #files = [text_file.filename for text_file in zip_file.infolist()] + #print(files) + "====================================================================================" + + "Извлечение одного файла" + "=======================" + #with zipfile.ZipFile(d, 'r') as zip_file: + # zip_file.extract('text1.txt', '.') Вместо точки можно указать куда восстановить + "=======================" + + "Извлечение из архива всего" + #with zipfile.ZipFile(d, 'r') as zip_file: + # zip_file.extractall(directory_to_extract_to) + "--------------------------" + + print_line(f"Бэкап {d} восстановлен", flag="GREEN") + + +@hlna.command(help='Бэкап серверов выбранной игры Date: Thu, 1 Jun 2023 15:01:53 +0300 Subject: [PATCH 53/71] restore backup --- hlna.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/hlna.py b/hlna.py index bc0adc8..0e58088 100755 --- a/hlna.py +++ b/hlna.py @@ -72,18 +72,24 @@ def restore(g,d): directory_to_extract_to = "*******" "Получение пути к файлам внутри архива, может понадобиться при раскидывании по местам" "===================================================================================" - #zip_file = zipfile.ZipFile(d) - #files = [text_file.filename for text_file in zip_file.infolist()] - #print(files) + zip_files_paths = zipfile.ZipFile(d) + files = [text_file.filename for text_file in zip_files_paths.infolist()] + print(files) "====================================================================================" - "Извлечение одного файла" + "Извлечение файлов" "=======================" - #with zipfile.ZipFile(d, 'r') as zip_file: - # zip_file.extract('text1.txt', '.') Вместо точки можно указать куда восстановить + for i in files: + with zipfile.ZipFile(d, 'r') as zip_file: + s = i.split("/") + s.pop(-1) + s = "/"+'/'.join(s)+'/' # вот тут где-то еще надо начало пути проверить и если home_dir другой заменить + print(s) + absolute_path = os.path.abspath(s) + zip_file.extract(i, '/') + "=======================" - - "Извлечение из архива всего" + "Извлечение из архива всего скорее всего не пригодится" #with zipfile.ZipFile(d, 'r') as zip_file: # zip_file.extractall(directory_to_extract_to) "--------------------------" From 30c2024c1be59a1033d9cfc473c81520a07f1ea5 Mon Sep 17 00:00:00 2001 From: sitisll Date: Thu, 1 Jun 2023 15:38:56 +0300 Subject: [PATCH 54/71] restore backup --- hlna.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/hlna.py b/hlna.py index 0e58088..ea38cdf 100755 --- a/hlna.py +++ b/hlna.py @@ -72,9 +72,8 @@ def restore(g,d): directory_to_extract_to = "*******" "Получение пути к файлам внутри архива, может понадобиться при раскидывании по местам" "===================================================================================" - zip_files_paths = zipfile.ZipFile(d) - files = [text_file.filename for text_file in zip_files_paths.infolist()] - print(files) + with zipfile.ZipFile(d, 'r') as zip_file: + files = zip_file.namelist() "====================================================================================" "Извлечение файлов" @@ -84,12 +83,10 @@ def restore(g,d): s = i.split("/") s.pop(-1) s = "/"+'/'.join(s)+'/' # вот тут где-то еще надо начало пути проверить и если home_dir другой заменить - print(s) - absolute_path = os.path.abspath(s) + print(i,colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL ) zip_file.extract(i, '/') - "=======================" - "Извлечение из архива всего скорее всего не пригодится" + "Извлечение из архива всего, скорее всего не пригодится" #with zipfile.ZipFile(d, 'r') as zip_file: # zip_file.extractall(directory_to_extract_to) "--------------------------" From 13bad49747a2de6b3b116d5890dd3a453677acc2 Mon Sep 17 00:00:00 2001 From: xpamych Date: Thu, 1 Jun 2023 19:42:44 +0300 Subject: [PATCH 55/71] 1 --- hlna.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/hlna.py b/hlna.py index ea38cdf..0404d62 100755 --- a/hlna.py +++ b/hlna.py @@ -68,7 +68,7 @@ def hlna(): @hlna.command(help='Восстановление бэкапов серверов в ') @click.argument('g', nargs=1) @click.option('-d',required=True , help="Путь до zip архива") -def restore(g,d): +def restore(g, d): directory_to_extract_to = "*******" "Получение пути к файлам внутри архива, может понадобиться при раскидывании по местам" "===================================================================================" @@ -101,20 +101,20 @@ def backup(g): source = [f"{dir_config}"] backup_path = input("Введите конечный путь для бэкапа, по умолчанию ******") if not backup_path: - backup_path = "/home/a11" + backup_path = f"{dir_server_ark}Backups" - today= backup_path + os.sep + time.strftime('%Y_%m_%d') - target = f"{backup_path}/" + g + "_backup-"+ time.strftime('%H_%M_%S') + '.zip' + today = backup_path + os.sep + time.strftime('%Y_%m_%d') + target = f"{backup_path}/" + g + "_backup-" + time.strftime('%H_%M_%S') + '.zip' create_dir(backup_path) with zipfile.ZipFile(target, 'w', zipfile.ZIP_DEFLATED, True) as myzip: for source_folder in source: - for root,dirs,files in os.walk(source_folder): + for root, dirs, files in os.walk(source_folder): for file in files: path = os.path.join(root, file) myzip.write(path) - print(path, colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL ) + print(path, colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL) - print(colorama.Fore.GREEN + f"Конфиги сохранены в {target}" + colorama.Style.RESET_ALL ) + print(colorama.Fore.GREEN + f"Конфиги сохранены в {target}" + colorama.Style.RESET_ALL) elif g == "7days": pass else: @@ -994,6 +994,7 @@ def zero(x=""): """Потом пригодится (нет)""" return "" + if not os.path.exists(dir_config + "config"): dir_server = path_server() else: From 21e35bb78b2242d3f0248733d15ff6a3c5835f71 Mon Sep 17 00:00:00 2001 From: sitisll Date: Fri, 2 Jun 2023 12:36:32 +0300 Subject: [PATCH 56/71] unit_tests --- hlna.py | 29 ++++---------- pytest.py | 118 ++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 100 insertions(+), 47 deletions(-) diff --git a/hlna.py b/hlna.py index 0404d62..9b69f6f 100755 --- a/hlna.py +++ b/hlna.py @@ -69,42 +69,29 @@ def hlna(): @click.argument('g', nargs=1) @click.option('-d',required=True , help="Путь до zip архива") def restore(g, d): - directory_to_extract_to = "*******" - "Получение пути к файлам внутри архива, может понадобиться при раскидывании по местам" - "===================================================================================" + "Получение пути к файлам внутри архива" with zipfile.ZipFile(d, 'r') as zip_file: files = zip_file.namelist() - "====================================================================================" - "Извлечение файлов" - "=======================" for i in files: with zipfile.ZipFile(d, 'r') as zip_file: - s = i.split("/") - s.pop(-1) - s = "/"+'/'.join(s)+'/' # вот тут где-то еще надо начало пути проверить и если home_dir другой заменить - print(i,colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL ) - zip_file.extract(i, '/') - "=======================" - "Извлечение из архива всего, скорее всего не пригодится" - #with zipfile.ZipFile(d, 'r') as zip_file: - # zip_file.extractall(directory_to_extract_to) - "--------------------------" - + path_extarct = "./" if g == 'test' else "/" + zip_file.extract(i, path_extarct) + print(i, colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL) print_line(f"Бэкап {d} восстановлен", flag="GREEN") @hlna.command(help='Бэкап серверов выбранной игры > /dev/null") - if x == 0: - print("Servers - "+Fore.GREEN + "OK" + Style.RESET_ALL) - else: - print(Fore.RED + "Servers Fail" + Style.RESET_ALL) -def delete(): - print("Delete - " + Fore.RED + "False" + Style.RESET_ALL) + +class TestFindFile(unittest.TestCase): + def setUp(self): + self.test_dir = 'test_dir' + os.mkdir(self.test_dir) + self.test_files = ['foo.conf', 'bar.ini', 'qux.cfg', 'baz.txt', '.directory'] + for f in self.test_files: + open(os.path.join(self.test_dir, f), 'w').close() + + def tearDown(self): + for f in self.test_files: + os.remove(os.path.join(self.test_dir, f)) + os.rmdir(self.test_dir) + + def test_find_file(self): + res = hlna.find_file(self.test_dir) + self.assertEqual(sorted(res), sorted(['foo.conf', 'bar.ini', 'qux.cfg', 'baz.txt'])) + + def test_find_file_empty_dir(self): + res = hlna.find_file('empty_dir') + self.assertEqual(res, []) + +class TestCreateDir(unittest.TestCase): + def test_create_dir(self): + testdir = 'testdir' + self.assertFalse(os.path.exists(testdir)) + hlna.create_dir(testdir) + self.assertTrue(os.path.exists(testdir)) + os.rmdir(testdir) + +class TestRestore(unittest.TestCase): + + def setUp(self): + self.runner = CliRunner() + self.zip_file_name = "test_backup.zip" + os.system("touch test_file1.txt test_file2.txt") + self.file_names = ["test_file1.txt", "test_file2.txt"] + with zipfile.ZipFile(self.zip_file_name, 'w') as zip_file: + for file_name in self.file_names: + zip_file.write(file_name) + + def tearDown(self): + os.remove(self.zip_file_name) + for file_name in self.file_names: + os.remove(file_name) + + def test_restore(self): + result = self.runner.invoke(hlna.restore, ["test", "-d", self.zip_file_name]) + self.assertEqual(result.exit_code, 0) + for file_name in self.file_names: + self.assertTrue(os.path.exists("./"+file_name)) + +class TestBackup(unittest.TestCase): + + def setUp(self): + data = hlna.read_yaml(g="path_server") + if data['path_server'] == "": + data['path_server'] = f"{home_dir}Servers/ARK/Backups/test_backup/" + else: + data['path_server'] = f"{data['path_server']}ARK/Backups/test_backup/" + self.backup_path = data['path_server'] + self.runner = CliRunner() + with open(f"{config_hlna}/ARK/test_file.txt", "w") as file: + file.write("test content") + + def tearDown(self): + os.remove(f"{config_hlna}ARK/test_file.txt") + for root, dirs, files in os.walk(self.backup_path): + for file in files: + os.remove(os.path.join(root, file)) + os.rmdir(self.backup_path) + + def test_backup(self): + result = self.runner.invoke(hlna.backup, ["ark_test"]) + self.assertEqual(result.exit_code, 0) + self.assertTrue(os.path.exists(self.backup_path)) + + target = f"{self.backup_path}ark_test_backup-" + time.strftime('%Y_%m_%d') + '.zip' + self.assertTrue(os.path.exists(target)) + with zipfile.ZipFile(target, 'r') as zip_file: + self.assertEqual(zip_file.testzip(), None) + self.assertTrue(os.path.exists(os.path.join(target, f"{config_hlna}ARK/test_file.txt"))) + +if __name__ == '__main__': + unittest.main() -if __name__ == "__main__": - - servers() - delete() - config() -#print(f"{Fore.GREEN} + {text}") -#print(Fore.YELLOW + "-"*30 + Style.RESET_ALL) From a02d81cf8090d1d30550f50184c8bb1c5797387e Mon Sep 17 00:00:00 2001 From: xpamych Date: Fri, 2 Jun 2023 16:13:57 +0300 Subject: [PATCH 57/71] len(*text) --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 9b69f6f..6c4d08e 100755 --- a/hlna.py +++ b/hlna.py @@ -197,7 +197,7 @@ def print_line(*text, flag="", sep=" ", end="\n"): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - len_text = len(text) + len_text = len(*text) print(colorama.Fore.LIGHTGREEN_EX + "." * len_text) print(color, *text, sep=sep, end=end) print(colorama.Fore.LIGHTGREEN_EX + "." * len_text + colorama.Style.RESET_ALL) From 55699412eaef60a7743e2e73e444f6b8491e43c9 Mon Sep 17 00:00:00 2001 From: xpamych Date: Fri, 2 Jun 2023 16:21:07 +0300 Subject: [PATCH 58/71] =?UTF-8?q?+2=20=D0=BA=20len?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlna.py b/hlna.py index 6c4d08e..3357df0 100755 --- a/hlna.py +++ b/hlna.py @@ -197,7 +197,7 @@ def print_line(*text, flag="", sep=" ", end="\n"): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - len_text = len(*text) + len_text = len(*text)+2 print(colorama.Fore.LIGHTGREEN_EX + "." * len_text) print(color, *text, sep=sep, end=end) print(colorama.Fore.LIGHTGREEN_EX + "." * len_text + colorama.Style.RESET_ALL) From 4bf547aefd0c535e984f3d4d7dd4724ad166fac2 Mon Sep 17 00:00:00 2001 From: xpamych Date: Fri, 2 Jun 2023 17:50:28 +0300 Subject: [PATCH 59/71] len + print --- hlna.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/hlna.py b/hlna.py index 3357df0..6bf74ec 100755 --- a/hlna.py +++ b/hlna.py @@ -69,7 +69,7 @@ def hlna(): @click.argument('g', nargs=1) @click.option('-d',required=True , help="Путь до zip архива") def restore(g, d): - "Получение пути к файлам внутри архива" + """Получение пути к файлам внутри архива""" with zipfile.ZipFile(d, 'r') as zip_file: files = zip_file.namelist() "Извлечение файлов" @@ -86,7 +86,7 @@ def restore(g, d): def backup(g): if g == "ark" or g == "ark_test": source = [f"{dir_config}"] - #backup_path = input("Введите конечный путь для бэкапа, по умолчанию ******") + # backup_path = input("Введите конечный путь для бэкапа, по умолчанию ******") 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" @@ -197,10 +197,12 @@ def print_line(*text, flag="", sep=" ", end="\n"): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - len_text = len(*text)+2 - print(colorama.Fore.LIGHTGREEN_EX + "." * len_text) + len_text = str(*text) + len_text = len_text.split("\n") + max_length = max(len(string) for string in len_text)+2 + print(colorama.Fore.LIGHTGREEN_EX + "." * max_length) print(color, *text, sep=sep, end=end) - print(colorama.Fore.LIGHTGREEN_EX + "." * len_text + colorama.Style.RESET_ALL) + print(colorama.Fore.LIGHTGREEN_EX + "." * max_length + colorama.Style.RESET_ALL) def check_int(number=""): From ce45d3fa7c6318b6980c013ecac2e7f08d29cb94 Mon Sep 17 00:00:00 2001 From: xpamych Date: Fri, 2 Jun 2023 18:11:15 +0300 Subject: [PATCH 60/71] =?UTF-8?q?color=20=D0=B4=D0=BB=D1=8F=20=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hlna.py b/hlna.py index 6bf74ec..bd296e2 100755 --- a/hlna.py +++ b/hlna.py @@ -200,9 +200,9 @@ def print_line(*text, flag="", sep=" ", end="\n"): len_text = str(*text) len_text = len_text.split("\n") max_length = max(len(string) for string in len_text)+2 - print(colorama.Fore.LIGHTGREEN_EX + "." * max_length) + print(color + "." * max_length) print(color, *text, sep=sep, end=end) - print(colorama.Fore.LIGHTGREEN_EX + "." * max_length + colorama.Style.RESET_ALL) + print(color + "." * max_length + colorama.Style.RESET_ALL) def check_int(number=""): From 3a3cce52575938282290c0daeefd97837344cc03 Mon Sep 17 00:00:00 2001 From: xpamych Date: Fri, 2 Jun 2023 22:08:36 +0300 Subject: [PATCH 61/71] =?UTF-8?q?=D1=80=D0=B5=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D1=81=D1=83?= =?UTF-8?q?=D1=89=D0=B5=D1=81=D1=82=D0=B2=D1=83=D1=8E=D1=89=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/hlna.py b/hlna.py index bd296e2..70025ef 100755 --- a/hlna.py +++ b/hlna.py @@ -67,12 +67,12 @@ def hlna(): @hlna.command(help='Восстановление бэкапов серверов в ') @click.argument('g', nargs=1) -@click.option('-d',required=True , help="Путь до zip архива") +@click.option('-d', required=True, help="Путь до zip архива") def restore(g, d): """Получение пути к файлам внутри архива""" with zipfile.ZipFile(d, 'r') as zip_file: files = zip_file.namelist() - "Извлечение файлов" + """Извлечение файлов""" for i in files: with zipfile.ZipFile(d, 'r') as zip_file: path_extarct = "./" if g == 'test' else "/" @@ -87,7 +87,7 @@ def backup(g): if g == "ark" or g == "ark_test": source = [f"{dir_config}"] # backup_path = input("Введите конечный путь для бэкапа, по умолчанию ******") - backup_path = f"{dir_server_ark}Backups" if g=="ark" else f"{dir_server_ark}Backups/test_backup" + 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" @@ -367,9 +367,19 @@ def config_nameserver(map_s): list_config.append(map_s) break else: - if name_server in list_config: - print_line("Имя занято", flag="RED") - config_nameserver(map_s) + list_allconfigs = list_config + delist_config + if name_server in list_allconfigs: + choose_reconf = input("""Сервер существует. Перенастроить? (по умолчанию) нет + 1. Да + 2. Нет + :""") + if choose_reconf == "": + config_nameserver(map_s) + elif choose_reconf == "1": + return name_server + else: + print_line("Введите новое имя сервера", flag="YELLOW") + config_nameserver(map_s) else: list_config.append(name_server) # если enter, то ставим последним элементом карту break @@ -438,7 +448,7 @@ def config_ark(list_config=list_config): print_line("Уже установленные карты: ", flag="CYAN") for i in list_config: data = read_yaml(i, g="ark") - print_line(f"{i} : {data['map']}", flag="CYAN") + print_line(f"Карта - {i} : Имя сервера {data['SessionName']}", flag="CYAN") count_maps = config_nummap() for i in range(count_maps): map_s, port_s, query_p, rcon_p = config_maps(i) From 2f31e01186c4bdb407b0d348e02c7ea35b45a486 Mon Sep 17 00:00:00 2001 From: xpamych Date: Fri, 2 Jun 2023 23:57:31 +0300 Subject: [PATCH 62/71] =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=B0,=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD=D0=B0=D0=B4=20?= =?UTF-8?q?=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF=D0=B0=D0=BC=D0=B8,=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD=D0=B0=D0=B4=20=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 91 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 57 insertions(+), 34 deletions(-) diff --git a/hlna.py b/hlna.py index 70025ef..7120e3f 100755 --- a/hlna.py +++ b/hlna.py @@ -5,6 +5,7 @@ import sys import zlib import time import struct +import tarfile import logging import datetime import requests @@ -12,7 +13,6 @@ import subprocess import yaml import click -import zipfile import colorama from pathlib import Path @@ -67,41 +67,44 @@ def hlna(): @hlna.command(help='Восстановление бэкапов серверов в ') @click.argument('g', nargs=1) +@click.option('-m', default='all', help="Название карты для запуска или all для запуска всех карт") @click.option('-d', required=True, help="Путь до zip архива") -def restore(g, d): +def restore(g, m, d): """Получение пути к файлам внутри архива""" - with zipfile.ZipFile(d, 'r') as zip_file: - files = zip_file.namelist() + with tarfile.open(d, 'r') as tar_file: + files = tar_file.namelist() """Извлечение файлов""" for i in files: - with zipfile.ZipFile(d, 'r') as zip_file: + with tar_file.extract(d, 'r:gz') as tar_file: path_extarct = "./" if g == 'test' else "/" - zip_file.extract(i, path_extarct) + tar_file.extract(i, path_extarct) print(i, colorama.Fore.GREEN + "- перемещен" + colorama.Style.RESET_ALL) print_line(f"Бэкап {d} восстановлен", flag="GREEN") @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") if x == 0: - print_line(f"Готов - {i}", flag="GREEN") #start = "start" if e else "stop" enable = "enable" if e else "disable" - os.system(f"systemctl --user {enable} ark_{i}") + os.system(f"systemctl --user {enable} ark_{i.lower()}") + print_line(f"Выполнено для сервера- {i}", flag="GREEN") else: print_line(f"Ошибка перемещения {i}", flag="RED") except: @@ -899,8 +917,10 @@ def start_stop(action, g, m): def read_yaml(list_config=list_config, flag=True, m="", g=""): """Читает конфиги активных или неактивных карт в зависимости от флага и отдаёт данные туда где их запросили""" + print_line("Вход в read_yaml", flag="RED") g = g.lower() 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}" @@ -908,6 +928,7 @@ def read_yaml(list_config=list_config, flag=True, m="", g=""): 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] # возвращаем словарь со всеми значениями @@ -936,14 +957,16 @@ def choose_map(g, m, list_config=list_config): print_line('Найдены сервера с этой картой', flag="CYAN") for i, map in enumerate(name_servers): print_line(f"{i + 1}) {map}", flag="CYAN") - while True: - try: - x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') - x = [int(i) for i in x] - break - except: - print_line("Неправильный ввод", flag="RED") - print(name_servers) + if i != 0: + while True: + try: + x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') + x = [int(i) for i in x] + break + except: + print_line("Неправильный ввод", flag="RED") + else: + x = [1] for i in x: new_arr.append(name_servers[i - 1]) print_line(f"Выбранные сервера: {name_servers}", flag="CYAN") From 61f653be2bad7956f9bc3426b7b3be15f3ac0432 Mon Sep 17 00:00:00 2001 From: xpamych Date: Sun, 4 Jun 2023 19:59:53 +0300 Subject: [PATCH 63/71] =?UTF-8?q?=D0=9C=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BC?= =?UTF-8?q?=D1=83=D1=87=D0=B0=D0=BB=D1=81=D1=8F=20=D1=81=20=D0=B1=D1=8D?= =?UTF-8?q?=D0=BA=D0=B0=D0=BF=D0=B0=D0=BC=D0=B8))=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=B2=D1=8B=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=20read=20yaml.=20=D0=97=D0=B0=D0=B5=D0=B1=D0=B0=D0=BB?= =?UTF-8?q?=D1=81=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" From 10b89ce25fa5d80f9e457ecd0c6660a6875274f2 Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 5 Jun 2023 10:58:39 +0300 Subject: [PATCH 64/71] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B7=D0=BC=D0=B5=D0=B9=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 126 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 76 insertions(+), 50 deletions(-) diff --git a/hlna.py b/hlna.py index bf485b2..be0cee7 100755 --- a/hlna.py +++ b/hlna.py @@ -5,6 +5,7 @@ import sys import zlib import time import struct +import curses import tarfile import logging import datetime @@ -65,56 +66,6 @@ def hlna(): pass -@hlna.command(help='Восстановление бэкапов серверов в ') -@click.argument('g', nargs=1) -@click.option('-m', default='all', help="Название карты для запуска или all для запуска всех карт") -@click.option('-d', required=True, help="Путь до zip архива") -def restore(g, m, d): - """Получение пути к файлам внутри архива""" - with tarfile.open(d, 'r') as tar_file: - 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_line(f"i - перемещен", flag="GREEN") - print_line(f"Бэкап {d} восстановлен", flag="GREEN") - - -@hlna.command(help='Бэкап серверов выбранной игры curses.COLS - 1: + x = 0 + y +=1 + stdscr.addstr(y, x, "⠋") + stdscr.refresh() + + def check_int(number=""): """Проверка на ввод числа""" while True: @@ -225,6 +201,56 @@ def check_int(number=""): print_line("Введите число", flag="CYAN") +@hlna.command(help='Восстановление бэкапов серверов в ') +@click.argument('g', nargs=1) +@click.option('-m', default='all', help="Название карты для запуска или all для запуска всех карт") +@click.option('-d', required=True, help="Путь до zip архива") +def restore(g, m, d): + """Получение пути к файлам внутри архива""" + with tarfile.open(d, 'r') as tar_file: + 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_line(f"i - перемещен", flag="GREEN") + print_line(f"Бэкап {d} восстановлен", flag="GREEN") + + +@hlna.command(help='Бэкап серверов выбранной игры Date: Mon, 5 Jun 2023 15:28:06 +0300 Subject: [PATCH 65/71] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B2=D0=BE=20?= =?UTF-8?q?=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=20=D0=B0=D0=BA=D1=82=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 35 ++++++++++++++++------------------- pytest.py | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/hlna.py b/hlna.py index be0cee7..e101a8c 100755 --- a/hlna.py +++ b/hlna.py @@ -295,6 +295,7 @@ def ports(port, ports_arr, flag): print_line("Port=", port, flag="CYAN") if port in ports_arr: print_line("Порт уже занят", flag="RED") + port = check_int("Введите новый порт") else: return port @@ -311,7 +312,7 @@ def config_cluster(): while True: cluster_id = input("Укажите id для кластера, любое сочетание символов: \n") if cluster_id == '': - print_line("Введите символы: ", glag="CYAN") + print_line("Введите символы: ", flag="CYAN") else: create_dir(dir_server_ark + cluster_id) cluster_dir_override = (dir_server_ark + cluster_id) @@ -385,9 +386,12 @@ def config_maps(i): return map_s, port_s, query_p, rcon_p -def config_nameserver(map_s): +def config_nameserver(map_s, flag=True): while True: - name_server = input("Укажите название Сервера: \n") + if flag: + name_server = input("Укажите название Сервера: \n") + else: + name_server = map_s if name_server == "": if map_s in list_config: count = 1 @@ -407,12 +411,12 @@ def config_nameserver(map_s): 2. Нет :""") if choose_reconf == "": - config_nameserver(map_s) + return elif choose_reconf == "1": - return name_server - else: print_line("Введите новое имя сервера", flag="YELLOW") - config_nameserver(map_s) + flag = True + else: + return else: list_config.append(name_server) # если enter, то ставим последним элементом карту break @@ -523,10 +527,8 @@ 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 # меняем флаг, если есть значение, которое не пустое @@ -783,7 +785,7 @@ def moddownload(g, m, id_mod, dir_mod_ark): if os.path.isfile(uncompressed): os.remove(uncompressed) except Exception as e: - print_line(e, flag="GREEN") + print_line(e, flag="RED") print_line(f"[x] Unpacking .z files failed, aborting mod install", flag="RED") return False @@ -829,6 +831,7 @@ def moddownload(g, m, id_mod, dir_mod_ark): f"mv {dir_workshop_ark}/appworkshop_{id_game_workshop}.acf {dir_mod_ark}/appworkshop_{id_game_workshop}.acf") + @hlna.command(help='Выключение/включение серверов (без удаления) Date: Mon, 5 Jun 2023 15:36:00 +0300 Subject: [PATCH 66/71] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20state=5F?= =?UTF-8?q?config1=20=D0=B7=D0=B0=20=D0=BD=D0=B5=D0=BD=D0=B0=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D1=81=D1=82=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 1 - 1 file changed, 1 deletion(-) diff --git a/hlna.py b/hlna.py index e101a8c..d2e7a8c 100755 --- a/hlna.py +++ b/hlna.py @@ -844,7 +844,6 @@ def switch(g, m, e): # добавить all create_dir(dir_deactivated) if e: port_s, query_p, rcon_p = ports_array() - state_config1 = list_config if e else delist_config state_msg = "активных" if e else "не активных" for i in m: try: From 09edcffd1f088d53d4027e7cbe53e8e6b495f10a Mon Sep 17 00:00:00 2001 From: xpamych Date: Mon, 5 Jun 2023 21:14:00 +0300 Subject: [PATCH 67/71] =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=8F=D0=BB=D0=B8=20na?= =?UTF-8?q?me=5Fserver(=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B1=D0=B5=D0=B4=D0=B8=D0=BB=D0=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 58 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/hlna.py b/hlna.py index d2e7a8c..c7293f7 100755 --- a/hlna.py +++ b/hlna.py @@ -155,7 +155,7 @@ def print_line(*text, flag="", sep=" ", end="\n"): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - len_text = str(*text) + len_text = str(text) len_text = len_text.split("\n") max_length = max(len(string) for string in len_text) + 2 print(color + "." * max_length) @@ -386,12 +386,12 @@ def config_maps(i): return map_s, port_s, query_p, rcon_p -def config_nameserver(map_s, flag=True): +def config_nameserver(map_s): while True: - if flag: - name_server = input("Укажите название Сервера: \n") - else: - name_server = map_s + name_exist_server = choose_map(g="ark", m=map_s)[-1] # вызывается когда не нужен, затем когда доходит до создания юнита в config_ark туда приходит не то имя, которое ожидалось + name_server = input("Укажите название Сервера: \n") + if name_exist_server != name_server: + os.system(f"mv {dir_unit}ark_{name_exist_server}.service {dir_unit}ark_{name_server}.service") if name_server == "": if map_s in list_config: count = 1 @@ -399,28 +399,34 @@ def config_nameserver(map_s, flag=True): while new_name in list_config: new_name = f"{map_s}{str(count)}" count += 1 - list_config.append(new_name) + name_server = new_name break else: - list_config.append(map_s) + name_server = map_s break else: - if name_server in list_allconfigs: - choose_reconf = input("""Сервер существует. Перенастроить? (по умолчанию) нет - 1. Да - 2. Нет + if name_server in list_config: + choose_reconf = input("""Сервер существует. (по умолчанию - отмена) + 1. Переименовать + 2. Изменить настройки + 3. Отмена :""") - if choose_reconf == "": - return + if choose_reconf == "" or choose_reconf == "3": + exit() elif choose_reconf == "1": - print_line("Введите новое имя сервера", flag="YELLOW") - flag = True + continue + elif choose_reconf == "2": + config_ark(flag=True) else: - return + print_line("Выберите ВОЗМОЖНОЕ действие") else: - list_config.append(name_server) # если enter, то ставим последним элементом карту break - return list_config + return name_server + + +def reconf_yaml(): + name_server = input("Укажите название Сервера: \n") + return name_server def config_ports(port_s): @@ -473,7 +479,7 @@ def config_listen(): return listen_server -def config_ark(list_config=list_config): +def config_ark(list_config=list_config, flag=False): """конфигурирование сервера арк""" create_dir(dir_server_ark) create_dir(dir_maps_ark) @@ -489,7 +495,10 @@ def config_ark(list_config=list_config): count_maps = config_nummap() for i in range(count_maps): map_s, port_s, query_p, rcon_p = config_maps(i) - list_config = config_nameserver(map_s) + if flag: + list_config = [reconf_yaml()] + else: + list_config = config_nameserver(map_s) port_server = config_ports(port_s) query_port = config_query(query_p) rcon_port = config_rcon(rcon_p) @@ -845,11 +854,13 @@ def switch(g, m, e): # добавить all if e: port_s, query_p, rcon_p = ports_array() state_msg = "активных" if e else "не активных" - for i in m: + name_server = choose_map(g, m) + for i in name_server: try: data = read_yaml(g="ark", m=i, flag=not e) if e: # добавить проверку занятости имени - data['SessionName'] = config_nameserver(i, flag=False)[-1] + if i in list_config: + data['SessionName'] = config_nameserver(i, flag=False)[-1] data['Port'] = ports(data['Port'], port_s, e) data['QueryPort'] = ports(data['QueryPort'], port_s, e) data['RCONPort'] = ports(data['RCONPort'], port_s, e) @@ -878,6 +889,7 @@ def switch(g, m, e): # добавить all print_line("ошибка операции", flag="RED") +# Добавить возможность вывода информации по запрошенной игре + карте (серверу), а так же по всем. @hlna.command(help='Выводит статус настроеных серверов') def status(list_config=list_config): ext_ip = get_external_ip() From 4fed6b897c081ad719d0433157d6a45bc0acd4e9 Mon Sep 17 00:00:00 2001 From: xpamych Date: Tue, 6 Jun 2023 23:08:00 +0300 Subject: [PATCH 68/71] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=D0=B8=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20status,?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=D0=B8=20reconf,?= =?UTF-8?q?=20rename,=20printline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 153 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 87 insertions(+), 66 deletions(-) diff --git a/hlna.py b/hlna.py index c7293f7..95011c3 100755 --- a/hlna.py +++ b/hlna.py @@ -1,11 +1,13 @@ #!/usr/bin/env python3 import os +import pprint import re import sys import zlib import time import struct import curses +import pprint import tarfile import logging import datetime @@ -155,9 +157,10 @@ def print_line(*text, flag="", sep=" ", end="\n"): color = colorama.Fore.CYAN else: color = colorama.Fore.WHITE - len_text = str(text) + + 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(str(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) @@ -288,11 +291,11 @@ def ports(port, ports_arr, flag): port = 27015 elif flag == 2: port = 23331 - print_line("Port=", port, flag="CYAN") + print_line(f"Port={port}", flag="CYAN") return port else: port = max(ports_arr) + 2 - print_line("Port=", port, flag="CYAN") + print_line(f"Port={port}", flag="CYAN") if port in ports_arr: print_line("Порт уже занят", flag="RED") port = check_int("Введите новый порт") @@ -388,10 +391,7 @@ def config_maps(i): def config_nameserver(map_s): while True: - name_exist_server = choose_map(g="ark", m=map_s)[-1] # вызывается когда не нужен, затем когда доходит до создания юнита в config_ark туда приходит не то имя, которое ожидалось name_server = input("Укажите название Сервера: \n") - if name_exist_server != name_server: - os.system(f"mv {dir_unit}ark_{name_exist_server}.service {dir_unit}ark_{name_server}.service") if name_server == "": if map_s in list_config: count = 1 @@ -414,9 +414,21 @@ def config_nameserver(map_s): if choose_reconf == "" or choose_reconf == "3": exit() elif choose_reconf == "1": - continue + new_nameserver = input("Укажите название Сервера: \n") + try: + if new_nameserver != name_server: + os.system(f"systemctl --user disable {dir_unit}ark_{name_server.lower()}.service") + os.system(f"rm {dir_unit}ark_{name_server.lower()}.service") + os.system(f"mv {dir_maps_ark}{name_server} {dir_maps_ark}{new_nameserver}") + return new_nameserver, True + else: + print_line("Вы ввели тоже имя.") + continue + except Exception: + print_line(Exception) elif choose_reconf == "2": - config_ark(flag=True) + config_ark(flag=False) + break else: print_line("Выберите ВОЗМОЖНОЕ действие") else: @@ -486,31 +498,37 @@ def config_ark(list_config=list_config, flag=False): id_mods_ark = "" cluster_server, cluster_id, cluster_dir_override = config_cluster() - + count_maps = config_nummap() if list_config: - print_line("Уже установленные карты: ", flag="CYAN") + print_line("Существующие активные карты: ", flag="CYAN") for i in list_config: data = read_yaml(g="ark", m=i) - print_line(f"Карта - {i} : Имя сервера {data['SessionName']}", flag="CYAN") - count_maps = config_nummap() + print_line(f"Карта - {data['map']} : Имя сервера {i}", flag="CYAN") for i in range(count_maps): map_s, port_s, query_p, rcon_p = config_maps(i) - if flag: - list_config = [reconf_yaml()] + if flag == True: + reconf_yaml() + break else: - list_config = config_nameserver(map_s) - port_server = config_ports(port_s) - query_port = config_query(query_p) - rcon_port = config_rcon(rcon_p) - rcon_enabled = True - password_server = config_password() - adminpassword_server = config_adminpassword() - max_players = config_players() - listen_server = config_listen() + name_server, flag = config_nameserver(map_s) + if flag == False: + port_server = config_ports(port_s) + query_port = config_query(query_p) + rcon_port = config_rcon(rcon_p) + rcon_enabled = True + password_server = config_password() + adminpassword_server = config_adminpassword() + max_players = config_players() + listen_server = config_listen() - yaml_create("ark", "", cluster_server, map_s, list_config[-1], port_server, query_port, - rcon_enabled, rcon_port, adminpassword_server, password_server, max_players, - id_mods_ark, cluster_id, cluster_dir_override, listen_server) + yaml_create("ark", "", 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) + data = read_yaml(g="ark", m=map_s) + yaml_create("ark", data['ServerPath'], data['Cluster'], data['map'], name_server, data['Port'], + data['QueryPort'], data['RCONEnabled'], data['RCONPort'], data['ServerAdminPassword'], + data['ServerPassword'],data['MaxPlayers'], id_mods_ark, data['clusterid'], data['clusterdir'], + data['Listen']) def config_7daystodie(): @@ -533,7 +551,7 @@ def config_7daystodie(): @click.argument('g', nargs=1) @click.option('-m', default='all', help="Название карты для запуска или all для запуска всех карт") def config_backup(g, m): - if g == "ark": + if g.lower() == "ark": name_server = choose_map(g, m) if m == "all": all_empty = True # флаг @@ -889,28 +907,19 @@ def switch(g, m, e): # добавить all print_line("ошибка операции", flag="RED") -# Добавить возможность вывода информации по запрошенной игре + карте (серверу), а так же по всем. @hlna.command(help='Выводит статус настроеных серверов') -def status(list_config=list_config): - ext_ip = get_external_ip() - if list_config == [] and delist_config == []: - print_line("Сервера не сконфигурированы", flag="RED") - else: - for i in list_config: - data = read_yaml(g="ark", m=i) - x = os.system(f"lsof -w -i :{data['Port']}") - if x == 0: - print_line("Сервер запущен", flag="GREEN") - else: - print_line("Сервер не запущен", flag="RED") - - # этот принт надо отдельной функцией сделать, чтобы убрать дублирование текста - - print_line(f""" - Имя сервера: {i} +@click.argument('g', nargs=1) +@click.option("-m", default='all', help="Название cервера") +def status(g, m="all", list_config=list_config): + """print_status делает вывод, flag - отвечает за показ активных/неактивных, под 7days надо будет дописать""" + def print_status(g, status_map, flag=True): + data = status_map + print_line(data["status"], flag=("YELLOW", "RED")[flag] if data['status'] == "Не запущен" else "GREEN") + print_line(f""" + Имя сервера: {data['SessionName']} Карта: {data['map']} Моды: {data['ModsId']} - Пароль: {data['ServerPassword']}S + Пароль: {data['ServerPassword']} Кластер: {data['Cluster']} Кластер id: {data['clusterid']} Query порт: {data['QueryPort']} @@ -918,26 +927,34 @@ def status(list_config=list_config): Rcon включен: {data['RCONEnabled']} Rcon порт : {data['RCONPort']} Максимальное кол-во игроков: {data['MaxPlayers']} - steam://connect/{ext_ip}:{data['QueryPort']}""", flag="CYAN") + steam://connect/{get_external_ip()}:{data['QueryPort']}""", flag=("YELLOW","CYAN")[flag]) - if delist_config != []: - x = input("Есть неактивные сервера, показать Y/n: ") - if x != "n": - for i in delist_config: - data = read_yaml(m=i,g="ark", flag=False) - print_line(f""" - Имя сервера: {i} - Карта: {data['map']} - Моды: {data['ModsId']} - Пароль: {data['ServerPassword']} - Кластер: {data['Cluster']} - Кластер id: {data['clusterid']} - Query порт: {data['QueryPort']} - Порт сервера: {data['Port']} - Rcon включен: {data['RCONEnabled']} - Rcon порт : {data['RCONPort']} - Максимальное кол-во игроков: {data['MaxPlayers']}""", flag="YELLOW") + def get_param(g, list_con, flag=True): + for i in list_con: + data = read_yaml(g=g, m=i, flag=flag) + status_map["ark"][flag][data["SessionName"]] = data + status_map["ark"][flag][data["SessionName"]]['status'] = "Не запущен" if os.system(f"lsof -w -i :{data['Port']}") else "Запущен" + if list_config == [] and delist_config == []: + print_line("Сервера не сконфигурированы", flag="RED") + exit() + "Это скорее всего можно как то покрасивее записать, но пока так)" + status_map = {} + status_map["ark"] = {} + status_map["ark"][True] = {} + status_map["ark"][False] = {} + get_param("ark", list_config) + get_param("ark", delist_config, False) + if g == "ark": + name_servers = choose_map(g, m) + for i in name_servers: + print_status(g, status_map[g][True][i]) + if delist_config != []: + x = input("Есть неактивные сервера, показать Y/n: ") + if x != "n": + for i in delist_config: + print_status(g, status_map[g][False][i], False) + return status_map @hlna.command(help='Запуск, сконфигурированного сервера или кластера ') @click.argument('g', nargs=1) @@ -1046,11 +1063,15 @@ def choose_map(g, m, list_config=list_config): print_line('Найдены сервера с этой картой', flag="CYAN") for i, map in enumerate(name_servers): print_line(f"{i + 1}) {map}", flag="CYAN") + print_line(f"{i + 2} Все", flag="CYAN") + x = None if i != 0: while True: try: x = input("Выберите сервер из списка, либо несколько через запятую: ").split(',') - x = [int(i) for i in x] + x = [int(j) for j in x] + if i + 2 in x: + return name_servers break except: print_line("Неправильный ввод", flag="RED") From 21c1a68ec1795e38038db5992e7d6944c844e5f2 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 7 Jun 2023 17:49:16 +0300 Subject: [PATCH 69/71] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=20=D0=B7=D0=BC=D0=B5=D0=B9=D0=BA=D1=83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hlna.py | 91 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/hlna.py b/hlna.py index 95011c3..3f01062 100755 --- a/hlna.py +++ b/hlna.py @@ -12,6 +12,7 @@ import tarfile import logging import datetime import requests +import threading import subprocess import yaml @@ -167,28 +168,29 @@ def print_line(*text, flag="", sep=" ", end="\n"): def zmeyuka(stdscr, func): + print_line(func) curses.curs_set(0) stdscr.nodelay(1) - x = 0 - y = 0 - - stdscr.addstr(y, x, "⠋") - stdscr.refresh() - def nachalo_stroki(): - nonlocal x, y - while True: - stdscr.addstr(0, 0, "⠋", curses.A_REVERSE) - stdscr.refresh() - time.sleep(0.1) - stdscr.addstr(y, x, " ") - x += 1 - if x > curses.COLS - 1: - x = 0 - y +=1 - stdscr.addstr(y, x, "⠋") - stdscr.refresh() + while func.do_run: + zmejka = '⠇⠋⠙⠸⠴⠦' + for i in range(len(zmejka)): + print('\r' + zmejka[i], end="", flush=True) + time.sleep(0.25) + th = threading.Thread(target=func) + th.start() +# Запуск потока со змеюкой + zmeyuka_thread = threading.Thread(target=nachalo_stroki) + zmeyuka_thread.start() +# Ожидаем завершение функции + th.join() +# Убираем змеюку + zmeyuka_thread.do_run = False + zmeyuka_thread.join() + + curses.curs_set(1) + stdscr.nodelay(0) def check_int(number=""): @@ -743,32 +745,35 @@ def modupdate(g, m, id_mod, dir_mod_ark): g = g.lower() if g == "ark": print_line(f"Проверяем обновление мода {id_mod}", flag="CYAN") - with open(os.path.join(dir_mod_ark, f"appworkshop_346110.acf"), "r") as f: - content = f.readlines() - content = "".join(content) - locale_date = "" - for line in content.splitlines(): - if '\t"WorkshopItemsInstalled"' in line: - for line in content.splitlines(): - if f'\t\t"timeupdated"' in line: - locale_date = line.split('"')[3] - if '}' in line: - break - break + if os.path.isfile(f"{dir_mod_ark}/appworkshop_346110.acf"): + with open(os.path.join(dir_mod_ark, f"appworkshop_346110.acf"), "r") as f: + content = f.readlines() + content = "".join(content) + locale_date = "" + for line in content.splitlines(): + if '\t"WorkshopItemsInstalled"' in line: + for line in content.splitlines(): + if f'\t\t"timeupdated"' in line: + locale_date = line.split('"')[3] + if '}' in line: + break + break + data = { + 'itemcount': 1, + 'publishedfileids[0]': id_mod + } + zapros = requests.post('http://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1', data=data) + json_zapros = zapros.json() + steam_date = json_zapros['response']['publishedfiledetails'][0]['time_updated'] - data = { - 'itemcount': 1, - 'publishedfileids[0]': id_mod - } - zapros = requests.post('http://api.steampowered.com/ISteamRemoteStorage/GetPublishedFileDetails/v1', data=data) - json_zapros = zapros.json() - steam_date = json_zapros['response']['publishedfiledetails'][0]['time_updated'] - - if int(steam_date) != int(locale_date): - print_line(f"Обновляем мод {id_mod}", flag="CYAN") - moddownload(g, m, id_mod, dir_mod_ark) + if int(steam_date) != int(locale_date): + print_line(f"Обновляем мод {id_mod}", flag="CYAN") + moddownload(g, m, id_mod, dir_mod_ark) + else: + print_line(f"Мод {id_mod} обновлен", flag="GREEN") else: - print_line(f"Мод {id_mod} обновлен", flag="GREEN") + print_line(f"Информация об обновлении не найдена. Переустанавливаем мод {id_mod}", flag="CYAN") + moddownload(g, m, id_mod, dir_mod_ark) def modupdateall(g, m): @@ -858,7 +863,6 @@ def moddownload(g, m, id_mod, dir_mod_ark): f"mv {dir_workshop_ark}/appworkshop_{id_game_workshop}.acf {dir_mod_ark}/appworkshop_{id_game_workshop}.acf") - @hlna.command(help='Выключение/включение серверов (без удаления) Date: Wed, 23 Aug 2023 15:36:21 +0300 Subject: [PATCH 70/71] git --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index df345ea..98c4fbd 100644 --- a/.gitignore +++ b/.gitignore @@ -76,4 +76,6 @@ CMakeLists.txt.user* *.pyproject *.pyproject.user *.ui -settings.json \ No newline at end of file +settings.json + +*.kdev4 From b0e1b72f711be5c09dcb52fdce2cc8d263315fc9 Mon Sep 17 00:00:00 2001 From: xpamych Date: Wed, 17 Jan 2024 14:58:49 +0300 Subject: [PATCH 71/71] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8e95a51..4c7f347 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ # Установка ```shell -curl https://www.elara.ws/lure.sh | bash & lure ar -n xpamych-repo -u https://gitflic.ru/project/xpamych/xpamych-lure-repo.git & lure in hlna-git +curl -fsSL lure.sh/install | bash && lure ar -n xpamych-repo -u https://gitflic.ru/project/xpamych/xpamych-lure-repo.git && lure in hlna-git ``` # Использование