Skip to content

Commit 56618d4

Browse files
Fix/rsyslog forwarding (#465)
* fix: idempotency and bugfix Signed-off-by: Tom Bosmans <tom.bosmans@be.ibm.com> * test: add test for remote syslog Signed-off-by: Tom Bosmans <tom.bosmans@be.ibm.com> * docs: update changelog Signed-off-by: Tom Bosmans <tom.bosmans@be.ibm.com> * build: update version and build dependencies Signed-off-by: Tom Bosmans <tom.bosmans@be.ibm.com> --------- Signed-off-by: Tom Bosmans <tom.bosmans@be.ibm.com>
1 parent a88b60f commit 56618d4

5 files changed

Lines changed: 75 additions & 18 deletions

File tree

docs/changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Latest
44

5+
## 2026.1.14.0
6+
7+
- fix: base/remote_syslog/forwarder.py - improved idempotency and bugfix
8+
59
## 2026.1.13.0
610

711
- fix: base/ssl_certificates/personal_certificate.py - fails to import if the keystore does not contain any personal certificates yet

ibmsecurity/isam/base/remote_syslog/forwarder.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def get(isamAppliance, server=None, port=None, protocol=None, id=None, check_mod
5656
return_obj = isamAppliance.create_return_object()
5757
return_obj['data'], i = _find_forwarder(ret_obj, server, port, protocol)
5858
warnings = []
59-
if return_obj['data'] == None:
59+
if return_obj['data'] is None:
6060
warnings.append(f"No entry found for server {server} port {port} and protocol {protocol}.")
6161
return_obj['warnings'] = warnings
6262

@@ -117,6 +117,10 @@ def set(isamAppliance, server=None, port=None, protocol='udp', id=None, debug=Fa
117117
Update or create a specific remote syslog forwarder
118118
"""
119119
warnings = []
120+
121+
if port and isinstance(port, basestring):
122+
port = int(port)
123+
120124
json_data = {
121125
'server': server,
122126
'port': port,
@@ -127,9 +131,6 @@ def set(isamAppliance, server=None, port=None, protocol='udp', id=None, debug=Fa
127131
if id is None:
128132
ret_obj = get_all(isamAppliance, check_mode, force)
129133

130-
if isinstance(port, basestring):
131-
port = int(port)
132-
133134
existing_forwarder, i = _find_forwarder(ret_obj, server, port, protocol)
134135
if existing_forwarder is not None and sources == [] and existing_forwarder['sources'] != sources:
135136
sources = existing_forwarder['sources']
@@ -154,23 +155,19 @@ def set(isamAppliance, server=None, port=None, protocol='udp', id=None, debug=Fa
154155
json_to_post = ret_obj['data']
155156
json_to_post.append(json_data)
156157
update_required = True
157-
warnings.append("existing_forwarder is None")
158+
warnings.append("This is a new forwarder")
158159
else:
159160
if format is not None:
160161
if ibmsecurity.utilities.tools.version_compare(isamAppliance.facts['version'], "10.0.2.0") < 0:
161162
warnings.append(f"Appliance at version: {isamAppliance.facts['version']}, format requires 10.0.2.0")
162163
else:
163164
json_data["format"] = format
164-
elif 'format' in ret_obj['data'][i]:
165-
del ret_obj['data'][i]['format']
166-
sorted_json_data = tools.json_sort(json_data)
167-
logger.debug(f"Sorted input: {sorted_json_data}")
168-
sorted_ret_obj = tools.json_sort(existing_forwarder)
169-
logger.debug(f"Sorted existing data: {sorted_ret_obj}")
170-
if sorted_ret_obj != sorted_json_data:
171-
logger.info("Changes detected, update needed.")
172-
ret_obj['data'][i] = json_data
173-
json_to_post = ret_obj['data']
165+
else:
166+
ret_obj['data'][i].pop('format', None)
167+
existing_forwarder.pop('id', None)
168+
if tools.json_equals(existing_forwarder, json_data, ignore_keys_not_in_new=True, skipkeys=True, sort_keys=True):
169+
update_required = False
170+
else:
174171
update_required = True
175172

176173
if update_required:

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[build-system]
22
requires = [
3-
"setuptools>=61",
3+
"setuptools>=65.3.0",
44
"wheel"
55
]
66
build-backend = "setuptools.build_meta"
77

88
[project]
99
name = "ibmsecurity"
10-
version = "2026.1.13.0"
10+
version = "2026.1.14.0"
1111
authors = [
1212
{ name="IBM", email="secorch@wwpdl.vnet.ibm.com" },
1313
]

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
packages=find_packages(exclude=["test.*","test"]),
66
# Date of release used for version - please be sure to use YYYY.MM.DD.seq#, MM and DD should be two digits e.g. 2017.02.05.0
77
# seq# will be zero unless there are multiple release on a given day - then increment by one for additional release for that date
8-
version="2026.1.13.0",
8+
version="2026.1.14.0",
99
description="Idempotent functions for IBM Verify Appliance REST APIs",
1010
author="IBM",
1111
author_email="secorch@wwpdl.vnet.ibm.com",
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import logging
2+
import pytest
3+
4+
import ibmsecurity.isam.base.remote_syslog.forwarder
5+
import ibmsecurity.isam.appliance
6+
7+
def getTestData():
8+
testdata = [
9+
{
10+
"port": "514",
11+
"protocol": "tcp",
12+
"server": "rsyslog",
13+
"sources": [
14+
{"facility": "local0",
15+
"name": "WebSEAL:default:msg__webseald-default.log",
16+
"severity": "info",
17+
"tag": "webseal"},
18+
{"facility": "local0",
19+
"name": "WebSEAL:default:request.log",
20+
"severity": "info",
21+
"tag": "request"},
22+
]
23+
},
24+
{
25+
"port": 6514,
26+
"protocol": "udp",
27+
"server": "rsyslog",
28+
"sources": [
29+
{"facility": "local0",
30+
"name": "WebSEAL:default:msg__webseald-default.log",
31+
"severity": "info",
32+
"tag": "webseal2"},
33+
{"facility": "local0",
34+
"name": "WebSEAL:default:request.log",
35+
"severity": "info",
36+
"tag": "request2"},
37+
]
38+
},
39+
]
40+
return testdata
41+
42+
43+
@pytest.mark.parametrize("items", getTestData())
44+
def test_set_remote_syslog_forwarder(iviaServer, caplog, items) -> None:
45+
"""Get tracing protection"""
46+
caplog.set_level(logging.DEBUG)
47+
arg = {}
48+
for k, v in items.items():
49+
arg[k] = v
50+
51+
returnValue = ibmsecurity.isam.base.remote_syslog.forwarder.set(iviaServer,
52+
**arg
53+
)
54+
logging.log(logging.INFO, returnValue)
55+
56+
assert not returnValue.failed()

0 commit comments

Comments
 (0)