diff --git a/0005-fixe-traceability-configuration-bugs.patch b/0005-fixe-traceability-configuration-bugs.patch new file mode 100644 index 0000000000000000000000000000000000000000..72083063011e4c5bb9e9366ff5eda0b32c6e82ed --- /dev/null +++ b/0005-fixe-traceability-configuration-bugs.patch @@ -0,0 +1,286 @@ +From 6d869ac7b13aa5d176cbbd208d22f13d153f1e9f Mon Sep 17 00:00:00 2001 +From: smjiao +Date: Mon, 18 Sep 2023 20:34:35 +0800 +Subject: [PATCH] fix bug + +--- + .../ragdoll/config_model/bash_config.py | 1 - + .../ragdoll/config_model/hosts_config.py | 3 +- + .../ragdoll/config_model/ssh_config.py | 2 + + .../ragdoll/controllers/confs_controller.py | 68 ++++++++++++------- + .../ragdoll/models/host_sync_result.py | 8 +-- + .../ragdoll/models/host_sync_status.py | 8 +-- + .../yang_modules/openEuler-sysctl.conf.yang | 2 +- + 7 files changed, 56 insertions(+), 36 deletions(-) + +diff --git a/gala-ragdoll/ragdoll/config_model/bash_config.py b/gala-ragdoll/ragdoll/config_model/bash_config.py +index 7b4b87d..608cd58 100644 +--- a/gala-ragdoll/ragdoll/config_model/bash_config.py ++++ b/gala-ragdoll/ragdoll/config_model/bash_config.py +@@ -30,7 +30,6 @@ class BashConfig(BaseHandlerConfig): + for line in conf_list: + if line is None or line.strip() == '': + continue +- + conf_dict_list.append(line) + return conf_dict_list + +diff --git a/gala-ragdoll/ragdoll/config_model/hosts_config.py b/gala-ragdoll/ragdoll/config_model/hosts_config.py +index 72b953e..0bda98d 100644 +--- a/gala-ragdoll/ragdoll/config_model/hosts_config.py ++++ b/gala-ragdoll/ragdoll/config_model/hosts_config.py +@@ -17,6 +17,7 @@ Description: /etc/hosts config handler + import re + import json + ++from ragdoll.config_model.base_handler_config import BaseHandlerConfig + from ragdoll.log.log import LOGGER + from ragdoll.utils.yang_module import YangModule + from ragdoll.const.conf_handler_const import NOT_SYNCHRONIZE, SYNCHRONIZED +@@ -102,7 +103,7 @@ class HostsConfig(BaseHandlerConfig): + + def write_conf(self): + content = "" +- for key, value in self.conf: ++ for key, value in self.conf.items(): + if value is not None: + conf_item = " ".join((key, str(value))).replace('\n', '\n\t') + content = content + conf_item + "\n" +diff --git a/gala-ragdoll/ragdoll/config_model/ssh_config.py b/gala-ragdoll/ragdoll/config_model/ssh_config.py +index c0cd0e0..bc46038 100644 +--- a/gala-ragdoll/ragdoll/config_model/ssh_config.py ++++ b/gala-ragdoll/ragdoll/config_model/ssh_config.py +@@ -17,11 +17,13 @@ Description: sshd config analyze + import json + import re + ++from ragdoll.config_model.base_handler_config import BaseHandlerConfig + from ragdoll.utils.yang_module import YangModule + from ragdoll.const.conf_handler_const import NOT_SYNCHRONIZE, SYNCHRONIZED + + SPACER_LIST = [' ', '\t'] + ++ + class SshConfig(BaseHandlerConfig): + + def parse_conf_to_dict(self, conf_info): +diff --git a/gala-ragdoll/ragdoll/controllers/confs_controller.py b/gala-ragdoll/ragdoll/controllers/confs_controller.py +index ae766fa..071e8c5 100644 +--- a/gala-ragdoll/ragdoll/controllers/confs_controller.py ++++ b/gala-ragdoll/ragdoll/controllers/confs_controller.py +@@ -11,6 +11,7 @@ from ragdoll.models.domain_name import DomainName # noqa: E501 + from ragdoll.models.excepted_conf_info import ExceptedConfInfo # noqa: E501 + from ragdoll.models.expected_conf import ExpectedConf # noqa: E501 + from ragdoll.models.real_conf_info import RealConfInfo # noqa: E501 ++from ragdoll.models.sync_req import SyncReq + from ragdoll.models.sync_status import SyncStatus # noqa: E501 + from ragdoll.models.conf_base_info import ConfBaseInfo + from ragdoll.models.conf_is_synced import ConfIsSynced +@@ -28,6 +29,7 @@ from ragdoll.utils.host_tools import HostTools + from ragdoll.utils.object_parse import ObjectParse + from ragdoll import util + from ragdoll.const.conf_files import yang_conf_list ++from ragdoll.log.log import LOGGER + + TARGETDIR = GitTools().target_dir + +@@ -163,9 +165,11 @@ def get_the_sync_status_of_domain(body=None): # noqa: E501 + man_conf_list = [] + for d_man_conf in manage_confs: + man_conf_list.append(d_man_conf.get("filePath").split(":")[-1]) ++ LOGGER.info("manage_confs is {}".format(manage_confs)) + for d_host in sync_status.host_status: + d_sync_status = d_host.sync_status + file_list = [] ++ LOGGER.info("d_sync_status is {}".format(d_sync_status)) + for d_file in d_sync_status: + file_path = d_file.file_path + file_list.append(file_path) +@@ -426,10 +430,16 @@ def sync_conf_to_host_from_domain(body=None): # noqa: E501 + :rtype: List[HostSyncResult] + """ + if connexion.request.is_json: +- body = ConfHost.from_dict(connexion.request.get_json()) # noqa: E501 ++ body = SyncReq.from_dict(connexion.request.get_json()) # noqa: E501 + + domain = body.domain_name +- host_list = body.host_ids ++ sync_list = body.sync_list ++ LOGGER.info("sync_list is {}".format(sync_list)) ++ ++ host_sync_confs = dict() ++ ++ for sync in sync_list: ++ host_sync_confs[sync.host_id] = sync.sync_configs + + # check the input domain + check_res = Format.domainCheck(domain) +@@ -458,11 +468,12 @@ def sync_conf_to_host_from_domain(body=None): # noqa: E501 + + # Check whether the host is in the managed host list + exist_host = [] +- if len(host_list) > 0: +- for host in host_list: ++ if len(host_sync_confs) > 0: ++ host_ids = host_sync_confs.keys() ++ for host_id in host_ids: + for d_host in res_host_text: +- if host.get("hostId") == d_host.get("hostId"): +- exist_host.append(host) ++ if host_id == d_host.get("hostId"): ++ exist_host.append(host_id) + else: + for d_host in res_host_text: + temp_host = {} +@@ -489,28 +500,35 @@ def sync_conf_to_host_from_domain(body=None): # noqa: E501 + + # Deserialize and reverse parse the expected configuration + sync_res = [] +- for d_host in exist_host: +- host_sync_result = HostSyncResult(host_id=d_host, ++ for host_id in exist_host: ++ host_sync_result = HostSyncResult(host_id=host_id, + sync_result=[]) ++ sync_confs = host_sync_confs.get(host_id) + for d_man_conf in manage_confs: + file_path = d_man_conf.get("filePath").split(":")[-1] +- contents = d_man_conf.get("contents") +- object_parse = ObjectParse() +- content = object_parse.parse_json_to_conf(file_path, contents) +- # Configuration to the host +- sync_conf_url = conf_tools.load_url_by_conf().get("sync_url") +- headers = {"Content-Type": "application/json"} +- data = {"host_id": d_host, "file_path": file_path, "content": content} +- sync_response = requests.put(sync_conf_url, data=json.dumps(data), headers=headers) +- +- resp_status = json.loads(sync_response.text).get("status") +- conf_sync_res = ConfSyncedRes(file_path=file_path, +- result="") +- if resp_status: +- conf_sync_res.result = "SUCCESS" +- else: +- conf_sync_res.result = "FAILED" +- host_sync_result.sync_result.append(conf_sync_res) ++ if file_path in sync_confs: ++ file_path = d_man_conf.get("filePath").split(":")[-1] ++ contents = d_man_conf.get("contents") ++ object_parse = ObjectParse() ++ content = object_parse.parse_json_to_conf(file_path, contents) ++ LOGGER.info("content IS {}".format(content)) ++ # Configuration to the host ++ sync_conf_url = conf_tools.load_url_by_conf().get("sync_url") ++ headers = {"Content-Type": "application/json"} ++ data = {"host_id": host_id, "file_path": file_path, "content": content} ++ sync_response = requests.put(sync_conf_url, data=json.dumps(data), headers=headers) ++ ++ resp_code = json.loads(sync_response.text).get('code') ++ resp = json.loads(sync_response.text).get('data').get('resp') ++ LOGGER.info("resp_code IS {}".format(resp_code)) ++ LOGGER.info("resp IS {}".format(resp)) ++ conf_sync_res = ConfSyncedRes(file_path=file_path, ++ result="") ++ if resp_code == "200" and resp.get('sync_result') is True: ++ conf_sync_res.result = "SUCCESS" ++ else: ++ conf_sync_res.result = "FAILED" ++ host_sync_result.sync_result.append(conf_sync_res) + sync_res.append(host_sync_result) + + return sync_res +diff --git a/gala-ragdoll/ragdoll/models/host_sync_result.py b/gala-ragdoll/ragdoll/models/host_sync_result.py +index 3e8d951..8604e31 100644 +--- a/gala-ragdoll/ragdoll/models/host_sync_result.py ++++ b/gala-ragdoll/ragdoll/models/host_sync_result.py +@@ -17,7 +17,7 @@ class HostSyncResult(Model): + Do not edit the class manually. + """ + +- def __init__(self, host_id: str=None, sync_result: List[ConfSyncedRes]=None): # noqa: E501 ++ def __init__(self, host_id: int = None, sync_result: List[ConfSyncedRes] = None): # noqa: E501 + """HostSyncResult - a model defined in Swagger + + :param host_id: The host_id of this HostSyncResult. # noqa: E501 +@@ -26,7 +26,7 @@ class HostSyncResult(Model): + :type sync_result: List[ConfSyncedRes] + """ + self.swagger_types = { +- 'host_id': str, ++ 'host_id': int, + 'sync_result': List[ConfSyncedRes] + } + +@@ -50,7 +50,7 @@ class HostSyncResult(Model): + return util.deserialize_model(dikt, cls) + + @property +- def host_id(self) -> str: ++ def host_id(self) -> int: + """Gets the host_id of this HostSyncResult. + + the id of host # noqa: E501 +@@ -61,7 +61,7 @@ class HostSyncResult(Model): + return self._host_id + + @host_id.setter +- def host_id(self, host_id: str): ++ def host_id(self, host_id: int): + """Sets the host_id of this HostSyncResult. + + the id of host # noqa: E501 +diff --git a/gala-ragdoll/ragdoll/models/host_sync_status.py b/gala-ragdoll/ragdoll/models/host_sync_status.py +index 5a40397..a785d17 100644 +--- a/gala-ragdoll/ragdoll/models/host_sync_status.py ++++ b/gala-ragdoll/ragdoll/models/host_sync_status.py +@@ -16,7 +16,7 @@ class HostSyncStatus(Model): + Do not edit the class manually. + """ + +- def __init__(self, host_id: str=None, sync_status: List[ConfIsSynced]=None): # noqa: E501 ++ def __init__(self, host_id: int = None, sync_status: List[ConfIsSynced] = None): # noqa: E501 + """SyncStatus - a model defined in Swagger + + :param host_id: The host_id of this HostSyncStatus. # noqa: E501 +@@ -25,7 +25,7 @@ class HostSyncStatus(Model): + :type host_status: List[object] + """ + self.swagger_types = { +- 'host_id': str, ++ 'host_id': int, + 'sync_status': List[ConfIsSynced] + } + +@@ -49,7 +49,7 @@ class HostSyncStatus(Model): + return util.deserialize_model(dikt, cls) + + @property +- def host_id(self) -> str: ++ def host_id(self) -> int: + """Gets the host_id of this HostSyncStatus. + + domain name # noqa: E501 +@@ -60,7 +60,7 @@ class HostSyncStatus(Model): + return self._host_id + + @host_id.setter +- def host_id(self, host_id: str): ++ def host_id(self, host_id: int): + """Sets the host_id of this HostSyncStatus. + + host id # noqa: E501 +diff --git a/gala-ragdoll/yang_modules/openEuler-sysctl.conf.yang b/gala-ragdoll/yang_modules/openEuler-sysctl.conf.yang +index e013ee2..01025a4 100644 +--- a/gala-ragdoll/yang_modules/openEuler-sysctl.conf.yang ++++ b/gala-ragdoll/yang_modules/openEuler-sysctl.conf.yang +@@ -62,7 +62,7 @@ module openEuler-sysctl.conf { + + sysctl:path "openEuler:/etc/sysctl.conf"; + sysctl:type "kv"; +- sysctl:spacer ""; ++ sysctl:spacer "="; + } + } + } +\ No newline at end of file +-- +2.38.1.windows.1 + diff --git a/A-Ops.spec b/A-Ops.spec index 9c3cf07194c41b01feeefc32122c6d5065ddfd9f..dbac7ee06df379408c8edde527e9c61707cf8a55 100644 --- a/A-Ops.spec +++ b/A-Ops.spec @@ -1,6 +1,6 @@ Name: A-Ops Version: v1.3.1 -Release: 3 +Release: 4 Summary: The intelligent ops toolkit for openEuler License: MulanPSL2 URL: https://gitee.com/openeuler/A-Ops @@ -9,6 +9,7 @@ Patch0001: 0001-fix-host-upload-traceability-configuration-issue.patch Patch0002: 0002-fix-kv-bug.patch Patch0003: 0003-fix-server-startup-error.patch Patch0004: 0004-codecheck.patch +Patch0005: 0005-fixe-traceability-configuration-bugs.patch %global debug_package %{nil} @@ -96,6 +97,9 @@ fi %changelog +* Tue Sep 19 2023 smjiao - v1.3.1-4 +- fix traceability configuration bugs + * Thu Sep 14 2023 gongzhengtang - v1.3.1-3 - fix server startup error and code check