Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
simonmeggle committed Oct 24, 2022
2 parents 71a13b1 + 09e8297 commit 06f45a2
Show file tree
Hide file tree
Showing 7 changed files with 121 additions and 35 deletions.
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,22 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 0.1.1-beta - 2022-10-24

### Added

- HTTPS/TLS support (#4)


### Fixed

- Default params für Discovery ergänzt (#3)
- Custom HTTP port übergabe gefixt (#1)

### Changed

- VPN-Status Zeitstempel: geändert auf "letzte Statusänderung"

## 0.1-beta - 2022-10-21

Initial release
Expand Down
21 changes: 21 additions & 0 deletions FRAGEN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# FRAGEN

(Eigene Fragen/Überlegungen als [Issue](https://github.com/elabit/checkmk_gematik_tikonn/issues) stellen oder per [Pull Request](https://github.com/elabit/checkmk_gematik_tikonn/pulls) direkt in [](./FRAGEN.md) aufnehmen)

- Der Agent wurde gegen die Spezifikation der Gematik entwickelt, jedoch nur mit "kocobox"-Konnektoren getestet.
🙋‍♂️ **Funktioniert er auch mit Geräten von RISE und Secunet?**
- Der Agent wurde im Code (und auch im Web-Setup) darauf vorbereitet, gleichzeitig mit verschiedenen WSDL-Versionen umgehen zu können.
🙋‍♂️ **Welche Versionen sind da draußen im Einsatz**?
- Je Konnektor werden auch die zugehörigen Kartenterminals (durch den DCD) angelegt.
🙋‍♂️ **Ist es hilfreich, auch die Kartenterminals im Monitoring zu haben? Aktuell wird nur ein informeller Check "SysInfo" generiert - welche Checks könnten noch nützlich sein?** (siehe Dump der Datenstruktur unten)
🙋‍♂️ **Wie gelingt es, die Kartenterminals mit IP-Adresse anzulegen? (Das wird vom DCD nativ nicht unterstützt)**
- Aktuell sind keine Tests implementiert. **Wer kann diese beisteuern?**
- **Welche anderen Features bzw. Werte könnten noch implementiert werden?**
- Ist es ggf. notwendig, einzelne Kertenterminals zu blacklisten?

## Appendix

### Kartenterminal-Info

![](img/kt_data.png)

31 changes: 14 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Checkmk Monitoring für Gematik TI-Konnektoren

[![MKP-Build](https://github.com/elabit/checkmk_gematik_tikonn/actions/workflows/mkp-build.yml/badge.svg)](https://github.com/elabit/checkmk_gematik_tikonn/actions/workflows/mkp-build.yml) [![MKP-Build-Release](https://github.com/elabit/checkmk_gematik_tikonn/actions/workflows/mkp-build-release.yml/badge.svg)](https://github.com/elabit/checkmk_gematik_tikonn/actions/workflows/mkp-build-release.yml) [![MD TOC](https://github.com/elabit/checkmk_gematik_tikonn/actions/workflows/md-toc.yml/badge.svg)](https://github.com/elabit/checkmk_gematik_tikonn/actions/workflows/md-toc.yml)

Bitte zuerst lesen 👉 https://forms.gle/13fGKvo98pCev1Cs9

## Beschreibung
Expand Down Expand Up @@ -36,7 +38,7 @@ Der Agent wurde vom [Krankenhaus des Landkreises Weilheim-Schongau](https://www.
* [CREDITS](#credits)

<!-- Created by https://github.com/ekalinin/github-markdown-toc -->
<!-- Added by: runner, at: Thu Oct 20 21:27:40 UTC 2022 -->
<!-- Added by: runner, at: Fri Oct 21 09:04:51 UTC 2022 -->

<!--te-->

Expand Down Expand Up @@ -64,35 +66,27 @@ Der Agent wurde vom [Krankenhaus des Landkreises Weilheim-Schongau](https://www.

## Tester gesucht! 👨‍🔬

Bis zum ersten stabilen Release sind noch folgende Fragen offen. Wer hat Zeit und Lust, diesen Check gegen Konnektoren in seiner (Test!)-Umgebung laufen zu lassen?
Installiere das MKP und lass den Special Agent gegen "Deine" Konnektoren laufen.

Zu klären ist unter anderem:
Es gibt mehrere Möglichkeiten, das Projekt zu unterstützen:

- Der Agent wurde gegen die Spezifikation der Gematik entwickelt, jedoch nur mit "kocobox"-Konnektoren getestet.
🙋‍♂️ **Funktioniert er auch mit Geräten von RISE und Secunet?**
- Der Agent wurde im Code (und auch im Web-Setup) darauf vorbereitet, gleichzeitig mit verschiedenen WSDL-Versionen umgehen zu können.
🙋‍♂️ **Welche Versionen sind da draußen im Einsatz**?
- Je Konnektor werden auch die zugehörigen Kartenterminals (durch den DCD) angelegt.
🙋‍♂️ **Ist es hilfreich, auch die Kartenterminals im Monitoring zu haben? Aktuell wird nur ein informeller Check generiert - welche Checks könnten noch nützlich sein?** (siehe Dump der Datenstruktur unten)
🙋‍♂️ **Wie gelingt es, die Kartenterminals mit IP-Adresse anzulegen? (Das wird vom DCD nativ nicht unterstützt)**
- Aktuell sind keine Tests implementiert. **Wer kann diese beisteuern?**
- **Welche anderen Features bzw. Werte könnten noch implementiert werden?**
- Grundsätzliche Fragen/Überlegungen/Feature Requests beisteuern:
- per [Issue](https://github.com/elabit/checkmk_gematik_tikonn/issues)
- per [Pull Request](https://github.com/elabit/checkmk_gematik_tikonn/pulls) direkt in [FRAGEN.md](./FRAGEN.md) aufnehmen
- Dokumentation (README, Inline-Help, ...)
- Coding (siehe [Development](#development))

Für einen besseren Überblick über die Hersteller- und Versionsabdeckung bitte ich alle Tester, vorab das folgende Formular auszufüllen:

https://forms.gle/13fGKvo98pCev1Cs9

Rückmeldungen jeglicher Art - Probleme, Bugs, Bugfixes, Feature Requests... - bitte ausschließlich über den Issue Tracker oder Pull Requests dieses Projekts.

Jede aktive Mithilfe, die das Projekt nach vorn bringt, wird mit einem **Robotmk-LED-Gyrotwister** (limitierte Auflage!) belohnt! 🚀 🎉

![](img/gtw.png)



![](img/kt_data.png)


## DEVELOPMENT

Kurzanleitung zum Entwickeln/Debuggen:
Expand All @@ -115,6 +109,9 @@ Die Kommunikation mit der SOAP-Schnittstelle der Konnektoren erfolgt über das [
```bash
OMD[testsite]:~$ python3 -m pip install zeep
```

💡 Die Installation von Python-Modulen per `pip` ist analog auch in einer CMK-Appliance möglich (SSH-Zugriff vorausgesetzt).

### WSDL

Der Special Agent benötigt zur Kommunikation mit der SOAP-Schnittstelle ferner eine [WSDL-Servicebeschreibung](https://de.wikipedia.org/wiki/Web_Services_Description_Language).
Expand Down Expand Up @@ -231,7 +228,7 @@ Auf Wunsch kann der [DCD](https://docs.checkmk.com/latest/de/dcd.html) eingesetz
- v2.3.24
- Gematik
- Konnektor-info allgemein: https://fachportal.gematik.de/hersteller-anbieter/komponenten-dienste/konnektor
- Spezifikation Konnektor: https://www.ina.gematik.de/standard/formhandler/324/gemSpec_Kon_V5_8_0.pdf
- Spezifikation Konnektor: https://fachportal.gematik.de/fachportal-import/files/gemSpec_Kon_V5.9.5.pdf
- Implementierungsleitfaden: https://fachportal.gematik.de/fachportal-import/files/gemILF_PS_V2.14.0.pdf
- Forum: https://fachportal.gematik.de
- Telematik Github Repo der Gematik: https://github.com/gematik/api-telematik
Expand Down
5 changes: 3 additions & 2 deletions agent_based/gematik_tikonn.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ def check_gematik_tikonn(item, params, section):
LOCAL_TZ
)
vpn_connected_time_str = vpn_connected_time.strftime("%H:%M Uhr (%d.%m.%Y)")
# Siehe Spezifikation, TAB_KON_568
yield Result(
state=vpn_status,
summary="{} ist {} - Letzte Verbindung: {}".format(
summary="{} ist {} - Letzte Statusänderung: {}".format(
item, vpn["ConnectionStatus"], vpn_connected_time_str
),
)
Expand All @@ -89,7 +90,7 @@ def check_gematik_tikonn(item, params, section):
service_name="TI-Konnektor %s",
discovery_function=discovery_gematik_tikonn,
# Default: TI=ja, SIS=nein
discovery_default_parameters={"vpn": (True, False)},
discovery_default_parameters={"vpn": (True, False), "peripherie": (True, True)},
discovery_ruleset_name="discovery_gematik_tikonn",
check_function=check_gematik_tikonn,
# check_ruleset_name="check_params_gematik_tikonn",
Expand Down
42 changes: 27 additions & 15 deletions agents/special/agent_gematik_tikonn
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ import re
import os
import sys
from zeep import helpers, Client, Settings
from requests import Session
from zeep.transports import Transport

import zeep
import datetime
import hashlib
Expand Down Expand Up @@ -48,6 +51,7 @@ class AgentGematikKonnektor:
parser.add_argument(
"-p", "--port", dest="port", default=80, required=False, help="TCP Port"
)
parser.add_argument("--verifyssl", default=False, action="store_true")
parser.add_argument(
"-m",
"--mandant",
Expand All @@ -73,6 +77,10 @@ class AgentGematikKonnektor:
return parser.parse_args(argv)

def main(self, args: Args):
if not args.verifyssl:
os.environ.pop("REQUESTS_CA_BUNDLE", None)
os.environ.pop("CURL_CA_BUNDLE", None)

kontexts = [
Kontext(args.mandant_id, args.client_id, workplace_id)
for workplace_id in args.workplace_ids.split(",")
Expand All @@ -81,11 +89,11 @@ class AgentGematikKonnektor:
# Todo Section manager

strategy = EventServiceGetResourceInformation()
session = Session(konnektor, strategy, kontexts)
session = KonnektorSession(konnektor, strategy, kontexts, args.port)
session.produce_output()

strategy = EventServiceGetCardTerminals()
session = Session(konnektor, strategy, kontexts)
session = KonnektorSession(konnektor, strategy, kontexts, args.port)
session.produce_output()


Expand Down Expand Up @@ -127,16 +135,12 @@ class Konnektor(object):
else:
self.sds_path = sds_path

# self.last_request = ""
# self.last_response = ""
# self.last_statuscode = 0
# self.last_message = ""
# self.last_reply_headers = ""
# self.last_reply_body = ""

@property
def url(self):
return "http://" + self.ip_address + ":" + str(self.port)
if self.port == "443":
return "https://" + self.ip_address + ":" + str(self.port)
else:
return "http://" + self.ip_address + ":" + str(self.port)


def zeep2dict(f_wrapped):
Expand Down Expand Up @@ -489,14 +493,15 @@ class PiggybackGroup:


# Context
class Session:
def __init__(self, konnektor: Konnektor, service: EventService, kontexts):
class KonnektorSession:
def __init__(self, konnektor: Konnektor, service: EventService, kontexts, port):
self.service = service
self.konnektor = konnektor
if not type(kontexts) == list:
self.kontexts = [kontexts]
else:
self.kontexts = kontexts
self.port = port
self.zeep_settings = Settings(forbid_entities=False)
self._client = None

Expand All @@ -523,9 +528,16 @@ class Session:
@property
def client(self):
if self._client is None:
# TODO: How can WSDL be loaded from variable?
# HEREIWAS
self._client = Client(str(self.service.wsdl), settings=self.zeep_settings)
# SSL support
transport = None
if self.port == "443":
sess = Session()
sess.verify = False
transport = Transport(session=sess)

self._client = Client(
str(self.service.wsdl), transport=transport, settings=self.zeep_settings
)
return self._client

@property
Expand Down
7 changes: 7 additions & 0 deletions checks/agent_gematik_tikonn
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ def agent_gematik_tikonn_arguments(params, hostname, ipaddress):
wsdl_v_eventservice = params["wsdl_versions"][0]
wsdl_v_signatureservice = params["wsdl_versions"][1]
workplace_ids = ",".join(params["workplace_ids"])

args = [
"--hostname",
ipaddress,
"--port",
str(params["port"]),
"--mandant",
params["mandant_id"],
"--client",
Expand All @@ -23,6 +26,10 @@ def agent_gematik_tikonn_arguments(params, hostname, ipaddress):
"--wsdlversion",
"SignatureService:{}".format(wsdl_v_signatureservice),
]

if params["verify_ssl"]:
args.append("--verifyssl")

return args


Expand Down
34 changes: 33 additions & 1 deletion web/plugins/wato/datasource_gematik_tikonn.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,13 @@
DropdownChoice,
Tuple,
ListOfStrings,
FixedValue,
Transform,
Alternative,
)

from cmk.gui.log import logger

# FIXME: Dokumentation versch. Rulespecs!
from cmk.gui.plugins.wato.datasource_programs import (
RulespecGroupDatasourceProgramsHardware,
Expand All @@ -27,6 +32,18 @@
# return TextAscii(title=_("Sector name"))


def forth(data):
if not "verify_ssl" in data:
# logger.critical("BEFORE: " + str(data))
data["verify_ssl"] = True
# logger.critical("AFTER: " + str(data))
return data


def _transform_valuespec_special_agents_gematik_tikonn():
return Transform(_valuespec_special_agents_gematik_tikonn(), forth=forth)


def _valuespec_special_agents_gematik_tikonn():
return Dictionary(
title=_("Gematik TI-Konnektor"),
Expand All @@ -44,6 +61,21 @@ def _valuespec_special_agents_gematik_tikonn():
default_value=80,
),
),
(
"verify_ssl",
# Transform(
Alternative(
title=_("Gültigkeit des SSL-Zertifikats"),
default_value=True,
elements=[
FixedValue(True, title=_("überprüfen"), totext=""),
FixedValue(False, title=_("nicht überprüfen"), totext=""),
],
),
# forth=lambda v: v if isinstance(v, dict) else {""}),
# forth=forth,
# ),
),
(
"wsdl_versions",
Tuple(
Expand Down Expand Up @@ -121,7 +153,7 @@ def _valuespec_special_agents_gematik_tikonn():
HostRulespec(
group=RulespecGroupDatasourceProgramsHardware,
name="special_agents:gematik_tikonn",
valuespec=_valuespec_special_agents_gematik_tikonn,
valuespec=_transform_valuespec_special_agents_gematik_tikonn,
)
)
)

0 comments on commit 06f45a2

Please sign in to comment.