Commit Graph

182 Commits

Author SHA1 Message Date
Tomas Dvorak
e620eeb59d Support for searchable snapshots in datanode (#18357)
* Support for searchable snapshots in datanode

* Added changelog

* Code cleanup, extracted s3 repository configuration

* fixed installing of s3 repo plugin

* code cleanup

* Install opensearch plugins from predownloaded zip archives

* fixed configuration key

* output datanode logs in DatanodeSearchableSnapshotsIT if startup fails

* transfer predownloaded opensearch plugins to the datanode docker image

* Set default node.search.cache.size to 10gb

* javadoc, code cleanup

* code cleanup

* fix s3 configuration enabled check, added test

* Add md5 checksum to the s3 repository download
2024-02-27 10:18:58 +01:00
Tomas Dvorak
ebf84b988e Propagate path.repo in datanode for filesystem snapshots (#18369)
* Propagate path.repo in datanode for filesystem snapshots

* Added changelog
2024-02-26 12:42:21 +01:00
Jan Heise
26aab20455 DataNode: Add max_clause_count default (#18354)
* add max_clause_count default

* add changelog
2024-02-23 13:38:23 +01:00
Jan Heise
a0bfb774f5 always either choose the config or active nodes (#18344) 2024-02-22 09:37:22 +01:00
Jan Heise
4044665c9b DataNode: rename cluster manager property (#18342)
* the original property has been renamed inside OpenSearch, these changes update

* fix changelog file

* fix naming
2024-02-21 16:57:56 +01:00
Dennis Oelkers
0cb4ae77c1 Moving data stream DTOs from storage module to core. (#18274) 2024-02-16 10:56:52 +01:00
Jan Heise
eefc838e05 DataNode: Adding the additional DataNode start step (#18270)
* adding the additional datanode start step

* switch to correct guard in remote reindexing

* fixing test

* moving steps a bit more, fixing tests

* changing startup

* changing startup, fixing states etc.

* fix test

* fix: do not set preflight result to FINISHED for reindexing branch

---------

Co-authored-by: Matthias Oesterheld <matthias.oesterheld@graylog.com>
2024-02-16 09:12:39 +01:00
Anton Ebel
2e0b5fe498 Remove default data_dir path configuration (#15902)
* add option for config parameter override

* add changelog and fix license headers

* fix review findings

* fix tests

* keep default values for bin_dir and plugin_dir

* fix data node tests

* fix tests

* fix tests

* make message_journal_dir not required, adapt graylog.conf and changelog

* fix review findings
2024-02-09 11:36:30 +01:00
Matthias Oesterheld
da40238728 Add datanode cluster metrics and dashboard (#18066)
* display cluster health on list page

* changelog file

* added Cluster Management tab

* fix build error

* removed CertificateRenewal panel in configuration page

* added ClusterManagementOverview with mock dashboard JSONs

* add fields

* refactor data stream functionality into DataStreamService

* add DataStreamService test

* collect node stat and cluster stat metrics

* added EnterpriseDynamicSearch

* create and show metrics dashboard

* add rate metrics

* add more metrics, finalize dashboards

* update dashboard and teaser

* update tests

* naming changes

* add `datanode/configured` endpoint to check if graylog is running against a data node search backend

* cleanup ClusterManagementTeaserSearch

* changelog type="added"

* wording: Data Node

* remove duplicate footer

* remove duplicate footer for both teaser and dynamic

* removed all unneeded actions

* re-add configured endpoint

* remove unnecessary NoopStreamService.java

---------

Co-authored-by: Mohamed Ould Hocine <mohamed.ould.hocine@graylog.com>
Co-authored-by: Mohamed OULD HOCINE <106236152+gally47@users.noreply.github.com>
Co-authored-by: Tomas Dvorak <tomas.dvorak@graylog.com>
2024-02-08 12:10:02 +01:00
Tomas Dvorak
f04fe4e6dd Unify usage of current supported mongodb version in tests (#18142)
* Update default mongo in integration tests to V7

* set default mongo to v5, keep v7 for later usage
2024-02-08 07:18:33 +01:00
Othello Maurer
81e34a5b17 Remove dependency to Mongojack 2 (#18016)
* Use official mongojack dependency
* Use unset instead of set(field, null) to prevent serialization errors
* Use different wrappers for single/multi update results
* Fix id conversion for ObjectId
* Remove unused method
* Always return saved object
* Handle null id in conversion
* Remove @Id annotation from constructor
* Extract saved ID via document codec
* Fix implementation of getN()
* Fix implementation of isUpdateOfExisting
* Add "sparse" index option
* Don't rely on in-place updates
* Fix #distinct
* Prevent ID injection into value classes
* Use ObjectIDs in filter queries matching "_id" fields
* Add package-info.java
* Add support for BsonTimestamp to Joda DateTime conversion
* Replace deprecated classes with Bson in method signatures
* Add tests that pass with both old and new implementation
* Deprecate CommonMongoJackObjectMapperProvider
* Add changelog
* Add upgrade note
* Remove handling of removed data type
* Refresh underlying cursor when find options are set
2024-02-07 18:04:50 +01:00
Matthias Oesterheld
28da751082 Make rest api available for UNCONFIGURED data node (#18176)
* post configure event to start Jersey server

* fallback to any node if no leader node present

* remove duplicate event post for secure setups, remove duplicate code
2024-02-07 12:46:58 +01:00
Othello Maurer
813203263b Restrict classes allowed for cluster config and event types (#18165)
Add a new safe_classes configuration option to restrict the classes allowed to be used
as cluster config and event types.
The configuration option allows to specify a comma-separated set of prefixes matched
against the fully qualified class name.

For now, the default value for the configuration is org.graylog.,org.graylog2., which will
allow all classes that Graylog maintains.

This should work out of the box for almost all setups. Changing the default value might
only be necessary if external plugins require cluster config or event types outside the
"org.graylog." or "org.graylog2." namespaces. If that is the case, the configuration setting
can be adjusted to cover this use case, e.b. by setting it to

    safe_classes = org.graylog.,org.graylog2.,custom.plugin.namespace.

if said classes are located within the custom.plugin.namespace package.

Refs: https://github.com/Graylog2/graylog2-server/security/advisories/GHSA-p6gg-5hf4-4rgj
2024-02-06 15:34:55 +01:00
Matthias Oesterheld
76ee116665 Bulk actions for data node (#18121)
* add action queue for data nodes and queued removal

* implement wait for completed bus event

* add change log

* add queue status to frontend

* add bulk start/stop

* adjust test for removing multiple nodes

* add queue field to entity test

* integrated bulk action endpoints

* action_queue status styling

* cleanup mocks

* add tests for removing multiple

* fixed requested wordings and typos

---------

Co-authored-by: Mohamed Ould Hocine <mohamed.ould.hocine@graylog.com>
Co-authored-by: Mohamed OULD HOCINE <106236152+gally47@users.noreply.github.com>
Co-authored-by: Laura <grotlue@users.noreply.github.com>
2024-02-05 18:53:34 +01:00
dependabot[bot]
d30123e979 Bump org.apache.commons:commons-exec from 1.3 to 1.4.0 (#17853)
Bumps org.apache.commons:commons-exec from 1.3 to 1.4.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-exec
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Matthias Oesterheld <33032967+moesterheld@users.noreply.github.com>
2024-02-01 17:18:07 +01:00
Jan Heise
22504a96e6 DataNode: Process State Machine Refactoring (#18036)
* create a provider for the state machine, inject it

* added license

* fixing provider class
2024-01-31 09:25:16 +01:00
Jan Heise
ac4caca1b4 DataNode: Added new state so that we don't automatically start (#17952)
* added new states

* fix error message

* adding new state to test

* removed doubled line

* start if insecure has been chosen

* adding jump

* always start if everything's confgured

* fixing test
2024-01-29 12:59:37 +01:00
Jan Heise
64aad4ea2b DataNode: Manually Migrating an OpenSearch 2.x cluster into the DataNode (#17707)
* guide, first version

* fix for correct start

* fixed typo

* adding script to create local docker images

* adding a little more info regarding locally generated docker images

* added macOS info

* added OpenSearch 1.3 info

* added Elasticsearch 7.10 info

* Update Migration.md

* renamed migration to manual to make scope clear

* added changelog
2024-01-29 09:03:46 +01:00
Matthias Oesterheld
3f1e6ba2b9 add search functionality for data streams (#17988)
* add fields

* refactor data stream functionality into DataStreamService

* add DataStreamService test

* Remove StreamService from IndexFieldTypesService (dependency simplification)

---------

Co-authored-by: Tomas Dvorak <tomas.dvorak@graylog.com>
2024-01-24 09:35:58 +01:00
Tomas Dvorak
799cea1e2c State machine and rest api for datanode migration (#18001)
* State machine and rest api for datanode migration

* added changelog

* added license

* renamed remote reindex resource api

* fixed RemoteReindexingMigrationIT

---------

Co-authored-by: Jan Heise <jan.heise@graylog.com>
2024-01-22 18:44:39 +01:00
Dennis Oelkers
aacaa0c4d2 Setting up injection/usage of new OpenSearch Java Client. (#17760)
* Adding new additional dependencies.

* Setting up injection infrastructure for new client in parallel.

* Adding license headers.

* Including new deps in test jar.

* Removing jakarta deps from assembly.

* Building separate jars for integration tests & distribution.

* Fix class loader issue

Exclude "module-info.class" files from the graylog-storage-opensearch
JAR file to avoid class loader issues.

Revert previous assembly and dependency changes that worked around the
issue in tests.

* Adjusting to Jakarta and recent data node changes.

* fixing wrong builder usage

---------

Co-authored-by: Bernd Ahlers <bernd@graylog.com>
Co-authored-by: Jan Heise <jan.heise@graylog.com>
2024-01-19 10:37:44 +01:00
Matthias Oesterheld
415cd73080 Add functionality to create data streams (#17910)
* Create Data Stream template, prepare ism policy

* add ism

* create ism and collect jvm heap as first metric

* change lookup and term query to use data streams

* start moving data stream functionality to graylog

* move data stream management into graylog

* code cleanup, add tests

* better validation, clean up after tests

* additional clean up after IT

* don't remove `index-management` plugin from datanode

* inject ObjectMapper

* change number of replicas from default 1 to 0 for test

* set `number_of_replicas` to 0 for .opendistro-ism-config in test

* replace javax with jakarta classes

* fix integration test

* remove data streams on test cleanup

* set high priority for data stream template
2024-01-17 14:45:19 +01:00
Othello Maurer
8ce9b3f532 Transition from javax to jakarta (#17765)
* Bump jersey version 2.37 -> 3.1.5

* javax.ws.rs:javax.ws.rs-api -> jakarta.ws.rs:jakarta.ws.rs-api

* Ban javax.ws.rs:javax.ws.rs-api dependency

* com.fasterxml.jackson.jaxrs -> com.fasterxml.jackson.jakarta.rs

* javax.validation -> jakarta.validation

* Remove exclusion of hibernate-validator

* jackson-module-jsonSchema -> jackson-module-jsonSchema-jakarta

* Bump hibernate-validator 6.2.5.Final -> 8.0.1.Final

* javax.annotation-api -> jakarta.annotation-api

* Add TODO for banning javax.validation:* dependencies

* Use jakarta.annotation.* where possible

* javax.inject -> jakarta.inject

* Temporarily disable merging master into PR branch when building

* Add javax.persistence to forbidden APIs

* Revert "Temporarily disable merging master into PR branch when building"

This reverts commit dadbeecc0f.

* Fix imports after merge

* Add changelog

* Fix imports after merge

* Add upgrade notes

* javax -> jakarta after merge
2024-01-16 14:07:12 +01:00
Jan Heise
8039e214cc DataNode: RemoteReindex backend impl (#17485)
* Remote Reindex Backend

* fixing missing classes

* Added integration test for remote reindex migration

---------

Co-authored-by: Tomas Dvorak <tomas.dvorak@graylog.com>
2024-01-15 09:41:02 +01:00
Jan Heise
b49a543e74 DataNode: Update to OpenSearch 2.11.0 (#17734)
* Update to OpenSearch 2.11.0

* Update to OpenSearch 2.11.0

* reverting test back

* reverting test back

* better handling of waiting for datanode startups in integration tests

---------

Co-authored-by: Tomas Dvorak <tomas.dvorak@graylog.com>
2024-01-10 08:28:36 +01:00
Tomas Dvorak
b0afd6206e Proxy for datanode rest, jwt auth filter for datanode (#17827)
* Proxy for datanode rest, jwt auth filter for datanode

* fixed test

* fixed test

* Fixed passing request body via datanode proxy

* disable entity capturing for datanode rest proxy calls

* datanode rest proxy refactored to okHttp client

* code cleanup, jwt token and auth filter separation

* Removed unused import

* code cleanup, fixed request body issue
2024-01-09 11:48:03 +01:00
dependabot[bot]
537f6de805 Bump org.codehaus.mojo:exec-maven-plugin from 3.0.0 to 3.1.1 (#17355)
Bumps [org.codehaus.mojo:exec-maven-plugin](https://github.com/mojohaus/exec-maven-plugin) from 3.0.0 to 3.1.1.
- [Release notes](https://github.com/mojohaus/exec-maven-plugin/releases)
- [Commits](https://github.com/mojohaus/exec-maven-plugin/compare/exec-maven-plugin-3.0.0...3.1.1)

---
updated-dependencies:
- dependency-name: org.codehaus.mojo:exec-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-08 16:56:40 +01:00
Mohamed OULD HOCINE
f0a9ca23ad Datanode List Page UI (#17161)
* cherry picked new datanode page

* initial setup for datanode page navigation

* added DataNodesPageNavigation to pages

* DataNodeList component initial setup

* fix build

* datanode list initial prototype

* fix eslint issues

* add datanode list components

* fix eslint issues

* add new data node button

* prepare column components

* DataNodeStatusCell component

* useDataNodes return type

* fix build

* fix build errors

* fix eslint issues

* initial api integration

* refetch on change

* added removeDataNode & rejoinDataNode endpoints

* datanode actions integration progress

* cleanup DataNodeStatusCell

* DataNodeStatusCell using data_node_status

* refetch list every 5s

* cleanup

* add datanode details page

* update datanode page

* add todo

* add license header

* fix linter

* fix linter

* Updating yarn lockfile (#17528)

Co-authored-by: Gary Bot <garybot2@graylog.com>

* replace quotes

* add confirm dialog for actions

* cleanup status cell

* handle certificate renewal

* remove bulk actions

* add start/stop datanode

* show leader and add cert info to details

* remove is_master

* use correct action on start button

* fix spelling

* fix review

* update Datatable QueryHelper example to use ReactNode

* remove DataNodeBulkActions

* fix query by name

* add check for removal of running nodes

* remove done todo

* fix reset to do a complete restart

* make status and cert_valid_until not sortable

* update spelling

* Update graylog2-web-interface/src/components/datanode/DataNodeList/DataNodeActions.tsx

* Update graylog2-web-interface/src/components/datanode/hooks/useDataNodes.ts

* show remove and rejoin for relevant state

---------

Co-authored-by: Ousmane Samba <ousmanesamba@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Gary Bot <garybot2@graylog.com>
Co-authored-by: Matthias Oesterheld <matthias.oesterheld@graylog.com>
Co-authored-by: Laura <grotlue@users.noreply.github.com>
2023-12-21 10:15:00 +01:00
Patrick Mann
a247edca65 Datanode: ensure password_secret meets length requirement (#17719)
* ensure password_secret meets length requirement

* update CL

* update test

* adjusted wording so it references the data node

---------

Co-authored-by: Jan Heise <jan.heise@graylog.com>
2023-12-15 20:53:32 +01:00
Matthias Oesterheld
c8e34b47a8 add validations for data node lifecycle functions (#17402)
* publish data node status

* add paginated datanode service

* changelog

* adjust changelog

* adjust NodeImplTest

* add start/stop functionality

* changelog

* re-add secured annotation

* refactor initial separation of server node and data node

* fix backward compatibility

* refactor separation of server node and data node

* add timezone

* add new service tests

* add entity tests

* inject DataNodeDto NodeService

* remove clustereventsubscriber registration

* add validations

* add verification tests

---------

Co-authored-by: Ousmane SAMBA <ousmane@graylog.com>
2023-12-05 12:16:39 +01:00
Tomas Dvorak
54c94057e4 Parser for opensearch/elasticsearch data directories (#17487)
* Parser for opensearch/elasticsearch data directories

* add opensearch 1.3 and elasticsearch 6.8.0 to indexer parser

* fixed paths

* code cleanup

* remove explicit dependency version of jackson smile

* Preflight check for index dir compatibility

* indexer dir parser fixed for empty dirs

* added changelog

* rest controller for indices directory parser

* require auth for indices compatibility rest api

* catch incompatibility exceptions of indices dir parsing

* code cleanup

* better dir detection handling

---------

Co-authored-by: Matthias Oesterheld <33032967+moesterheld@users.noreply.github.com>
2023-12-01 16:39:37 +01:00
Bernd Ahlers
28f59c326f Fix Data Node system parameters pre-flight check (#17497)
- Read the "max_map_count" from the /proc system instead of calling the
  /sbin/sysctl command
- Only run check on Linux operating systems (avoids warning on FreeBSD)
- Throw "PreflightCheckException" instead of "RuntimeException"
- Don't use "System.out.println()" for logging
- Enhance changelog entry to help users to understand the fix

Refs https://github.com/Graylog2/graylog2-server/pull/17436
2023-11-29 11:34:15 +01:00
Matthias Oesterheld
076db1a460 Publish and show data node state information (#17382)
* publish data node status

* add paginated datanode service

* changelog

* adjust changelog

* adjust NodeImplTest

* refactor initial separation of server node and data node

* fix backward compatibility

* refactor separation of server node and data node

* add timezone

* add new service tests

* add entity tests

* inject DataNodeDto NodeService
2023-11-28 15:02:27 +01:00
Patrick Mann
72fcbbe960 ignore check on Mac (#17486) 2023-11-27 17:54:53 +01:00
Patrick Mann
a613989e71 Check vm.max_map_count in datanode preflight (#17436)
* check vm.max_map_count in preflight

* CL

* fix command path for macOS

* Revert "fix command path for macOS"

This reverts commit caff2a512b.

* revert unneeded macOS check; rename
2023-11-27 09:14:23 +01:00
dependabot[bot]
a484ba8af2 Bump org.codehaus.mojo:build-helper-maven-plugin from 3.4.0 to 3.5.0 (#17465)
Bumps [org.codehaus.mojo:build-helper-maven-plugin](https://github.com/mojohaus/build-helper-maven-plugin) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/mojohaus/build-helper-maven-plugin/releases)
- [Commits](https://github.com/mojohaus/build-helper-maven-plugin/compare/3.4.0...3.5.0)

---
updated-dependencies:
- dependency-name: org.codehaus.mojo:build-helper-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-27 08:47:57 +01:00
Matthias Oesterheld
c6101f395c Remove a data node from the cluster (#17248)
* service, rest & permissions for data node management

* add tests

* add reset data node event

* add states and transitions for node removal
add node removal functionality

* changelog

* add datanode permissions to permission list

* add audit event types to list

* add custom thread factory

* add node removal integration test
refactor rest calls in ITs

* wait for primary shard node availability

* refactor duplicate code

* simplify node retrieval

* add `@OnlyInSecuredNode` annotation and request filter
move delete endpoint to management controller and secure it
adjust IT
change javadoc

* stabilize tests
2023-11-20 13:33:26 +01:00
Tomas Dvorak
5a9fc45402 Allow configuring exact datanode directories without automatic nodeid subdirs (#17255)
* Allow configuring exact datanode directories without automatic nodeid subdirs

* added changelog

* use proper locking mechanism to create datanode.lock files

* code cleanup

* code cleanup

* removed unused imports

* fixed test

---------

Co-authored-by: Matthias Oesterheld <33032967+moesterheld@users.noreply.github.com>
2023-11-16 11:26:10 +01:00
Bernd Ahlers
8cb8adeb24 Update download-maven-plugin to our fork (#17245)
The caching in the latest upstream version is completely broken since
April 2023 and the maintainers are currently unresponsive.

Our fork is based on version 1.6.8 and fixes the excessive download
progress logging which is a problem with the log size limit on
GitHub Actions.
2023-11-14 09:27:02 +01:00
dependabot[bot]
fc91fbe89a Bump org.codehaus.mojo:buildnumber-maven-plugin from 1.4 to 3.2.0 (#16745)
* Bump org.codehaus.mojo:buildnumber-maven-plugin from 1.4 to 3.2.0

Bumps [org.codehaus.mojo:buildnumber-maven-plugin](https://github.com/mojohaus/buildnumber-maven-plugin) from 1.4 to 3.2.0.
- [Release notes](https://github.com/mojohaus/buildnumber-maven-plugin/releases)
- [Commits](https://github.com/mojohaus/buildnumber-maven-plugin/compare/buildnumber-maven-plugin-1.4...3.2.0)

---
updated-dependencies:
- dependency-name: org.codehaus.mojo:buildnumber-maven-plugin
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Don't use useLastCommittedRevision setting

If this is enabled, the new buildnumber plugin version sets the
buildNumber to "null" instead of the last commit in the repository.

* Missed the removal of useLastCommittedRevision in data-node/pom.xml

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bernd Ahlers <bernd@graylog.com>
2023-11-14 08:55:27 +01:00
Tomas Dvorak
473272c703 Remove final flag from ServerBootstrap option variables, they need to be modifiable. (#17169) 2023-11-06 11:21:15 +01:00
Jan Heise
27f79d7913 DataNode: make the cluster name configurable (#17143)
* make the cluster name configurable

* added changelog

* precise, that it's the data node we talk about in the CL

Co-authored-by: Matthias Oesterheld <33032967+moesterheld@users.noreply.github.com>

---------

Co-authored-by: Matthias Oesterheld <33032967+moesterheld@users.noreply.github.com>
2023-11-02 11:06:22 +01:00
Tomas Dvorak
220f14eb3b Fix opensearch configuration sync permissions (#17059)
* Fix opensearch configuration sync permissions

* added changelog
2023-11-02 08:36:35 +01:00
Jan Heise
d709ae84da DataNode: using hostname as node name default (#17025)
* using the hostname as the default node-name, if none was specified explicitly

* using the hostname as the default node-name, if none was specified explicitly

* using the hostname as the default node-name, if none was specified explicitly

* nodeName is either set explicitly in the conf file or will be the result of the hostname setting otherwise

* small refactoring
2023-10-24 11:01:20 +02:00
Bernd Ahlers
8ce60c9d75 Bump to 6.0.0-SNAPSHOT 2023-10-23 13:18:49 +02:00
Jenkins
8a5c2c8e7d [graylog2-server] prepare for next development iteration 2023-10-23 09:51:49 +00:00
Jenkins
406c65eeaf [graylog2-server] prepare release 5.2.0-rc.1 2023-10-23 09:31:51 +00:00
Tomas Dvorak
066794fe6f Fix file permissions for key material (#17026)
* Fix file permissions for key material #17009

* added changelog

* correct file permissions for private key used during preflight CSR

* better http and transport keystore files generation

* removed changelog

---------

Co-authored-by: Jan Heise <jan.heise@graylog.com>
2023-10-23 09:52:49 +02:00
Jan Heise
bf0fe158d5 DataNode: Always using the hostname from the configuration in the NodePingPeriodical (#17020)
* using always the hostname from the configuration

* fixing test

* make existing test more meaningful, removed redundant test
2023-10-20 14:47:32 +02:00
Tomas Dvorak
42aa1c36ed add banner for initial datanode start, promoting preflight interface (#17008) 2023-10-20 14:44:17 +02:00