From dbbafddaec65a32fe0dd591039a241752d216a9a Mon Sep 17 00:00:00 2001
From: Marco Del Tufo <marco.deltufo@exact-lab.it>
Date: Wed, 2 Aug 2023 15:25:36 +0000
Subject: [PATCH] Update maintenance-tasks.md

---
 .../advanced-features/maintenance-tasks.md    | 420 +++++++++++-------
 1 file changed, 265 insertions(+), 155 deletions(-)

diff --git a/docs/system-admin-documentation/advanced-features/maintenance-tasks.md b/docs/system-admin-documentation/advanced-features/maintenance-tasks.md
index 750198fabc8..73cb9ae4168 100644
--- a/docs/system-admin-documentation/advanced-features/maintenance-tasks.md
+++ b/docs/system-admin-documentation/advanced-features/maintenance-tasks.md
@@ -63,11 +63,14 @@ the files to be stored have to be larger than a minimum size.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.ArchivingByRequestTask
-    interval = 1 d
-    minimum-container-size-in-bytes =  20000000000
-    maximum-container-size-in-bytes = 200000000000
-    configuration-file-path = ../../../data/groups.json
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.ArchivingByRequestTask
+interval = 1 d
+minimum-container-size-in-bytes =  20000000000
+maximum-container-size-in-bytes = 200000000000
+configuration-file-path = ../../../data/groups.json
+```
+
 
 **Notes:**  In practice every instance using multi dataset archiving
 feature and also the ELN-LIMS should have this enabled.
@@ -96,14 +99,17 @@ archived yet.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.AutoArchiverTask
-    interval = 10 days
-    archive-candidate-discoverer.class = ch.systemsx.cisd.etlserver.plugins.TagArchiveCandidateDiscoverer
-    archive-candidate-discoverer.tags = /admin-user/archive
-    policy.class = ch.systemsx.cisd.etlserver.plugins.GroupingPolicy
-    policy.minimal-archive-size = 1500000
-    policy.maximal-archive-size = 3000000
-    policy.grouping-keys = Space#DataSetType, Space#Experiment:merge
+```
+class = ch.systemsx.cisd.etlserver.plugins.AutoArchiverTask
+interval = 10 days
+archive-candidate-discoverer.class = ch.systemsx.cisd.etlserver.plugins.TagArchiveCandidateDiscoverer
+archive-candidate-discoverer.tags = /admin-user/archive
+policy.class = ch.systemsx.cisd.etlserver.plugins.GroupingPolicy
+policy.minimal-archive-size = 1500000
+policy.maximal-archive-size = 3000000
+policy.grouping-keys = Space#DataSetType, Space#Experiment:merge
+```
+
 
 ### BlastDatabaseCreationMaintenanceTask 
 
@@ -164,11 +170,14 @@ properties need to scanned they should be added to the plugin.properties
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.BlastDatabaseCreationMaintenanceTask
-    interval = 1 h
-    dataset-types = BLAST-.+
-    entity-sequence-properties = SAMPLE+OLIGO+SEQUENCE, EXPERIMENT+YEAST+PLASMID_SEQUENCE
-    blast-tools-directory = /usr/local/ncbi/blast/bin
+```
+class = ch.systemsx.cisd.etlserver.plugins.BlastDatabaseCreationMaintenanceTask
+interval = 1 h
+dataset-types = BLAST-.+
+entity-sequence-properties = SAMPLE+OLIGO+SEQUENCE, EXPERIMENT+YEAST+PLASMID_SEQUENCE
+blast-tools-directory = /usr/local/ncbi/blast/bin
+```
+
 
 ### DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask 
 
@@ -195,9 +204,12 @@ If this task isn't configured neither in service.properties nor as a core plugin
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask
-    interval = 60
-    last-seen-data-set-file = lastSeenDataSetForDeletion.txt
+```
+class = ch.systemsx.cisd.etlserver.plugins.DeleteDataSetsAlreadyDeletedInApplicationServerMaintenanceTask
+interval = 60
+last-seen-data-set-file = lastSeenDataSetForDeletion.txt
+```
+
 
 ### DeleteFromArchiveMaintenanceTask 
 
@@ -220,9 +232,12 @@ AS. This tasks needs the archive plugin to be configured in
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.DeleteFromArchiveMaintenanceTask
-    interval = 3600
-    status-filename = ../archive-cleanup-status.txt
+```
+class = ch.systemsx.cisd.etlserver.plugins.DeleteFromArchiveMaintenanceTask
+interval = 3600
+status-filename = ../archive-cleanup-status.txt
+```
+
 
 ### DeleteFromExternalDBMaintenanceTask 
 
@@ -250,10 +265,13 @@ by DSS.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask
-    interval = 300
-    data-source = proteomics-db
-    data-set-table-name = data_sets 
+```
+class = ch.systemsx.cisd.etlserver.plugins.DeleteFromExternalDBMaintenanceTask
+interval = 300
+data-source = proteomics-db
+data-set-table-name = data_sets
+```
+ 
 
 ### EventsSearchMaintenanceTask
 
@@ -277,8 +295,11 @@ There are no specific configuration parameters for this task.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.events_search.EventsSearchMaintenanceTask
-    interval = 1 day
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.events_search.EventsSearchMaintenanceTask
+interval = 1 day
+```
+
 
 ### ExperimentBasedArchivingTask 
 
@@ -306,12 +327,15 @@ some criteria. This tasks needs the archive plugin to be configured in
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.ExperimentBasedArchivingTask
-    interval = 86400
-    minimum-free-space-in-MB = 2048
-    monitored-dir = /my-data/
-    estimated-data-set-size-in-KB.RAW_DATA = 12000
-    estimated-data-set-size-in-KB.DEFAULT = 35000
+```
+class = ch.systemsx.cisd.etlserver.plugins.ExperimentBasedArchivingTask
+interval = 86400
+minimum-free-space-in-MB = 2048
+monitored-dir = /my-data/
+estimated-data-set-size-in-KB.RAW_DATA = 12000
+estimated-data-set-size-in-KB.DEFAULT = 35000
+```
+
      
 
 If there is not enough free space the task archives all data sets
@@ -363,11 +387,14 @@ are organized hierachical in accordance to their experiment and samples
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.HierarchicalStorageUpdater
-    storeroot-dir = ${root-dir}
-    hierarchy-root-dir = ../../mirror
-    link-naming-strategy.template = ${space}/${project}/${experiment}/${sample}/${dataSetType}-${dataSet}
-    link-naming-strategy.component-template = ${space}/${project}/${experiment}/${containerSample}/${containerDataSetType}-${containerDataSet}/${dataSetType}-${dataSet} 
+```
+class = ch.systemsx.cisd.etlserver.plugins.HierarchicalStorageUpdater
+storeroot-dir = ${root-dir}
+hierarchy-root-dir = ../../mirror
+link-naming-strategy.template = ${space}/${project}/${experiment}/${sample}/${dataSetType}-${dataSet}
+link-naming-strategy.component-template = ${space}/${project}/${experiment}/${containerSample}/${containerDataSetType}-${containerDataSet}/${dataSetType}-${dataSet} 
+```
+
 
 ### MultiDataSetDeletionMaintenanceTask 
 
@@ -401,10 +428,13 @@ configured.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetDeletionMaintenanceTask
-    interval = 1 d
-    last-seen-event-id-file = ${storeroot-dir}/MultiDataSetDeletionMaintenanceTask-last-seen-event-id.txt
-    mapping-file = etc/mapping.tsv 
+```
+class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetDeletionMaintenanceTask
+interval = 1 d
+last-seen-event-id-file = ${storeroot-dir}/MultiDataSetDeletionMaintenanceTask-last-seen-event-id.txt
+mapping-file = etc/mapping.tsv 
+```
+
 
 **NOTE**: Should be configured on any instance using the multi dataset
 archiver when the archive data should be deletable.
@@ -429,9 +459,12 @@ otherwise random unarchiving events triggered by the users.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetUnarchivingMaintenanceTask
-    interval = 1 d
-    start = 01:00  
+```
+class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetUnarchivingMaintenanceTask
+interval = 1 d
+start = 01:00  
+```
+
 
 ### MultiDataSetArchiveSanityCheckMaintenanceTask
 
@@ -464,12 +497,15 @@ e.g. final destination location).
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetArchiveSanityCheckMaintenanceTask
-    interval = 3600
-    check-from-date = 2022-09-01 00:00
-    check-to-date = 2022-10-01 00:00
-    notify-emails = test1@email.com, test2@email.com
-    status-file = ../../multi-dataset-sanity-check-statuses.json
+```
+class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.MultiDataSetArchiveSanityCheckMaintenanceTask
+interval = 3600
+check-from-date = 2022-09-01 00:00
+check-to-date = 2022-10-01 00:00
+notify-emails = test1@email.com, test2@email.com
+status-file = ../../multi-dataset-sanity-check-statuses.json
+```
+
 
 ### PathInfoDatabaseFeedingTask 
 
@@ -501,9 +537,12 @@ data set is the starting point when the task is executed next time.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseFeedingTask
-    execute-only-once = true
-    compute-checksum = true  
+```
+class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseFeedingTask
+execute-only-once = true
+compute-checksum = true 
+```
+ 
 
 ### PostRegistrationMaintenanceTask
 
@@ -527,15 +566,18 @@ post-registration tasks for each freshly registered data set.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask
-    interval = 60
-    cleanup-tasks-folder = ../cleanup-tasks
-    ignore-data-sets-before-date = 2011-01-27
-    last-seen-data-set-file = ../last-seen-data-set
-    post-registration-tasks = eager-shuffling, eager-archiving
-    eager-shuffling.class = ch.systemsx.cisd.etlserver.postregistration.EagerShufflingTask
-    eager-shuffling.share-finder.class = ch.systemsx.cisd.openbis.dss.generic.shared.ExperimentBasedShareFinder
-    eager-archiving.class = ch.systemsx.cisd.etlserver.postregistration.ArchivingPostRegistrationTask
+```
+class = ch.systemsx.cisd.etlserver.postregistration.PostRegistrationMaintenanceTask
+interval = 60
+cleanup-tasks-folder = ../cleanup-tasks
+ignore-data-sets-before-date = 2011-01-27
+last-seen-data-set-file = ../last-seen-data-set
+post-registration-tasks = eager-shuffling, eager-archiving
+eager-shuffling.class = ch.systemsx.cisd.etlserver.postregistration.EagerShufflingTask
+eager-shuffling.share-finder.class = ch.systemsx.cisd.openbis.dss.generic.shared.ExperimentBasedShareFinder
+eager-archiving.class = ch.systemsx.cisd.etlserver.postregistration.ArchivingPostRegistrationTask
+```
+
 
 ### RevokeUserAccessMaintenanceTask
 
@@ -569,8 +611,11 @@ on the server.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.RevokeUserAccessMaintenanceTask
-    interval = 60 s
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.RevokeUserAccessMaintenanceTask
+interval = 60 s
+```
+
 
 ### UserManagementMaintenanceTask
 
@@ -601,9 +646,12 @@ Instances](https://unlimited.ethz.ch/display/openBISDoc2010/User+Group+Managemen
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.UserManagementMaintenanceTask
-    start = 02:42
-    interval = 1 day
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.UserManagementMaintenanceTask
+start = 02:42
+interval = 1 day
+```
+
 
 ## Consistency and other Reports
 
@@ -626,9 +674,12 @@ doesn't work for RsyncArchiver, TarArchiver or ZipArchiver.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.DataSetArchiverOrphanFinderTask
-    interval = 60 s
-    email-addresses = email1@bsse.ethz.ch, email2@bsse.ethz.ch
+```
+class = ch.systemsx.cisd.etlserver.plugins.DataSetArchiverOrphanFinderTask
+interval = 60 s
+email-addresses = email1@bsse.ethz.ch, email2@bsse.ethz.ch
+```
+
 
 **Notes:** This is a consistency check task. It checks consistency for
 datasets with the flag present-in-archive.
@@ -661,11 +712,14 @@ years. It does the check only during the night and continues next night.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.path.DataSetAndPathInfoDBConsistencyCheckTask
-    interval = 1 days
-    start = 23:15
-    pausing-time-point = 5:00
-    checking-time-interval = 3653 days
+```
+class = ch.systemsx.cisd.etlserver.path.DataSetAndPathInfoDBConsistencyCheckTask
+interval = 1 days
+start = 23:15
+pausing-time-point = 5:00
+checking-time-interval = 3653 days
+```
+
 
 ### MaterialExternalDBSyncTask
 
@@ -693,14 +747,17 @@ materials.
 
 **service.properties of AS**
 
-    <task id>.class = ch.systemsx.cisd.openbis.generic.server.task.MaterialExternalDBSyncTask
-    <task id>.interval = 120
-    <task id>.read-timestamp-sql = select timestamp from timestamp
-    <task id>.update-timestamp-sql = update timestamp set timestamp = ?
-    <task id>.insert-timestamp-sql = insert into timestamp values(?)
-    <task id>.mapping-file = ../report-mapping.txt
-    <task id>.database-driver = org.postgresql.Driver
-    <task id>.database-url = jdbc:postgresql://localhost/material_reporting
+```
+<task id>.class = ch.systemsx.cisd.openbis.generic.server.task.MaterialExternalDBSyncTask
+<task id>.interval = 120
+<task id>.read-timestamp-sql = select timestamp from timestamp
+<task id>.update-timestamp-sql = update timestamp set timestamp = ?
+<task id>.insert-timestamp-sql = insert into timestamp values(?)
+<task id>.mapping-file = ../report-mapping.txt
+<task id>.database-driver = org.postgresql.Driver
+<task id>.database-url = jdbc:postgresql://localhost/material_reporting
+```
+
 
 #### Mapping File
 
@@ -752,13 +809,16 @@ name>]
 
 **mapping.txt**
 
-    # Some comments
-    [GENE: GENE, GENE_ID]
-    GENE_SYMBOLS: symbol
+```
+# Some comments
+[GENE: GENE, GENE_ID]
+GENE_SYMBOLS: symbol
+
+[SIRNA: si_rna, code]
+INHIBITOR_OF: suppressed_gene
+SEQUENCE: Nucleotide_sequence
+```
 
-    [SIRNA: si_rna, code]
-    INHIBITOR_OF: suppressed_gene
-    SEQUENCE: Nucleotide_sequence
 
 Some rules:
 
@@ -786,10 +846,13 @@ Instances](/pages/viewpage.action?pageId=80699449).
 In order to be able to send an e-mail the following properties in
 `service.properties` have to be defined:
 
-    mail.from = openbis@<host>
-    mail.smtp.host = <SMTP host>
-    mail.smtp.user = <can be empty>
-    mail.smtp.password = <can be empty>
+```
+mail.from = openbis@<host>
+mail.smtp.host = <SMTP host>
+mail.smtp.user = <can be empty>
+mail.smtp.password = <can be empty>
+```
+
 
 **Configuration**:
 
@@ -806,9 +869,12 @@ In order to be able to send an e-mail the following properties in
 
 **Example**:
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.UsageReportingTask
-    interval = 7 days
-    email-addresses = ab@c.de, a@bc.de
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.UsageReportingTask
+interval = 7 days
+email-addresses = ab@c.de, a@bc.de
+```
+
 
   
 
@@ -830,7 +896,7 @@ in `service.properties` of AS.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.BatchSampleRegistrationTempCodeUpdaterTask
+`class = ch.systemsx.cisd.openbis.generic.server.task.BatchSampleRegistrationTempCodeUpdaterTask`
 
 ### CleanUpUnarchivingScratchShareTask 
 
@@ -847,8 +913,11 @@ archiving](/pages/viewpage.action?pageId=80699422).
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.CleanUpUnarchivingScratchShareTask
-    interval = 60 s
+```
+class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.archiver.CleanUpUnarchivingScratchShareTask
+interval = 60 s
+```
+
 
 **Notes:** Recommended cleanup task to run on every instance.
 
@@ -867,10 +936,13 @@ type.
 In order to be able to send an e-mail the following properties in
 `service.properties` have to be defined:
 
-    mail.from = openbis@<host>
-    mail.smtp.host = <SMTP host>
-    mail.smtp.user = <can be empty>
-    mail.smtp.password = <can be empty>
+```
+mail.from = openbis@<host>
+mail.smtp.host = <SMTP host>
+mail.smtp.user = <can be empty>
+mail.smtp.password = <can be empty>
+```
+
 
 **Configuration:**
 
@@ -895,11 +967,14 @@ day of month. If only weekly reports are needed the parameter
 
 **service.properties of AS**
 
-    <task id>.class = ch.systemsx.cisd.openbis.generic.server.task.DataSetRegistrationSummaryTask
-    <task id>.interval = 86400
-    <task id>.start = 1:00
-    <task id>.data-set-types = RAW_DATA, MZXML_DATA
-    <task id>.email-addresses = albert.einstein@princeton.edu, charles.darwin@evolution.org 
+```
+<task id>.class = ch.systemsx.cisd.openbis.generic.server.task.DataSetRegistrationSummaryTask
+<task id>.interval = 86400
+<task id>.start = 1:00
+<task id>.data-set-types = RAW_DATA, MZXML_DATA
+<task id>.email-addresses = albert.einstein@princeton.edu, charles.darwin@evolution.org 
+```
+
 
 This means that on the 1st day of every month at 1:00 AM openBIS sends
 to the specified e-mail recipients a report about the data sets of types
@@ -923,8 +998,11 @@ RAW\_DATA and MZXML\_DATA that have been uploaded in the previous month.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.DynamicPropertyEvaluationMaintenanceTask
-    interval = 3600
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.DynamicPropertyEvaluationMaintenanceTask
+interval = 3600
+```
+
 
 ### DynamicPropertyEvaluationTriggeredByMaterialChangeMaintenanceTask
 
@@ -948,9 +1026,12 @@ materials changed since the last re-evaluation.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.DynamicPropertyEvaluationTriggeredByMaterialChangeMaintenanceTask
-    interval = 7 days
-    initial-timestamp = 2012-12-31
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.DynamicPropertyEvaluationTriggeredByMaterialChangeMaintenanceTask
+interval = 7 days
+initial-timestamp = 2012-12-31
+```
+
 
 ### FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask 
 
@@ -989,10 +1070,13 @@ by the maintenance task. 
 
 **plugin.properties**
 
-    <task id>.class = ch.systemsx.cisd.etlserver.plugins.FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask
-    <task id>.interval = 86400
-    <task id>.data-set-chunk-size = 1000
-    <task id>.time-limit = 1h
+```
+<task id>.class = ch.systemsx.cisd.etlserver.plugins.FillUnknownDataSetSizeInOpenbisDBFromPathInfoDBMaintenanceTask
+<task id>.interval = 86400
+<task id>.data-set-chunk-size = 1000
+<task id>.time-limit = 1h
+```
+
 
 **NOTE**: Useful in scenarios where the path info feeding sub task of
 post registration task fails.
@@ -1019,9 +1103,12 @@ data source for key 'path-info-db'. 
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseChecksumCalculationTask
-    execute-only-once = true
-    checksum-type = SHA-256
+```
+class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseChecksumCalculationTask
+execute-only-once = true
+checksum-type = SHA-256
+```
+
 
 ### PathInfoDatabaseRefreshingTask
 
@@ -1056,10 +1143,13 @@ Under normal circumstances this maintenance task is never needed, because the co
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseRefreshingTask
-    interval = 30 min
-    time-stamp-of-youngest-data-set = 2014-01-01 00:00:00
-    data-set-type = HCS_IMAGE
+```
+class = ch.systemsx.cisd.etlserver.path.PathInfoDatabaseRefreshingTask
+interval = 30 min
+time-stamp-of-youngest-data-set = 2014-01-01 00:00:00
+data-set-type = HCS_IMAGE
+```
+
 
 ### RemoveUnusedUnofficialTermsMaintenanceTask
 
@@ -1082,9 +1172,12 @@ Terms](/pages/viewpage.action?pageId=80699498).
 
 **service.properties of AS**
 
-    <task id>.class = ch.systemsx.cisd.openbis.generic.server.task.RemoveUnusedUnofficialTermsMaintenanceTask
-    <task id>.interval = 86400
-    <task id>.older-than-days = 30
+```
+<task id>.class = ch.systemsx.cisd.openbis.generic.server.task.RemoveUnusedUnofficialTermsMaintenanceTask
+<task id>.interval = 86400
+<task id>.older-than-days = 30
+```
+
 
 ### ResetArchivePendingTask
 
@@ -1100,8 +1193,11 @@ command in the DSS data set command queues referring to it.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.etlserver.plugins.ResetArchivePendingTask
-    interval = 60 s
+```
+class = ch.systemsx.cisd.etlserver.plugins.ResetArchivePendingTask
+interval = 60 s
+```
+
 
 ### SessionWorkspaceCleanUpMaintenanceTask
 
@@ -1118,8 +1214,11 @@ plugin is detected then the automatic configuration is skipped.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.generic.server.task.SessionWorkspaceCleanUpMaintenanceTask
-    interval = 1 day
+```
+class = ch.systemsx.cisd.openbis.generic.server.task.SessionWorkspaceCleanUpMaintenanceTask
+interval = 1 day
+```
+
 
 ### MaterialsMigration
 
@@ -1144,12 +1243,15 @@ service.properties
 
 **service.properties**
 
-    maintenance-plugins = materials-migration
+```
+maintenance-plugins = materials-migration
+
+materials-migration.class = ch.systemsx.cisd.openbis.generic.server.task.MaterialsMigration
+materials-migration.execute-only-once = true
+materials-migration.doMaterialsMigrationInsertNew = true
+materials-migration.doMaterialsMigrationDeleteOld = true
+```
 
-    materials-migration.class = ch.systemsx.cisd.openbis.generic.server.task.MaterialsMigration
-    materials-migration.execute-only-once = true
-    materials-migration.doMaterialsMigrationInsertNew = true
-    materials-migration.doMaterialsMigrationDeleteOld = true
 
   
 
@@ -1188,21 +1290,26 @@ with
 
 **specify\_thumbnail\_generation.py**
 
-    from ch.systemsx.cisd.openbis.dss.etl.dto.api.impl import MaximumIntensityProjectionGenerationAlgorithm
-    from sets import Set
+```py
+from ch.systemsx.cisd.openbis.dss.etl.dto.api.impl import MaximumIntensityProjectionGenerationAlgorithm
+from sets import Set
+
+
+def _get_series_num():
+series_numbers = Set()
+for image_info in image_data_set_structure.getImages():
+    series_numbers.add(image_info.tryGetSeriesNumber())
+return series_numbers.pop()
+
+def process(transaction, parameters, tableBuilder):
+seriesNum = _get_series_num()
+if int(seriesNum) % 2 == 0:
+    image_config.setImageGenerationAlgorithm(
+            MaximumIntensityProjectionGenerationAlgorithm(
+                "MICROSCOPY_IMG_THUMBNAIL", 256, 128, "thumbnail.png"))
+```
 
-    def _get_series_num():
-        series_numbers = Set()
-        for image_info in image_data_set_structure.getImages():
-            series_numbers.add(image_info.tryGetSeriesNumber())
-        return series_numbers.pop()
 
-    def process(transaction, parameters, tableBuilder):
-        seriesNum = _get_series_num()
-        if int(seriesNum) % 2 == 0:
-            image_config.setImageGenerationAlgorithm(
-                    MaximumIntensityProjectionGenerationAlgorithm(
-                        "MICROSCOPY_IMG_THUMBNAIL", 256, 128, "thumbnail.png"))
 
 ### DeleteFromImagingDBMaintenanceTask
 
@@ -1222,8 +1329,11 @@ with the same configuration parameters.
 
 **plugin.properties**
 
-    class = ch.systemsx.cisd.openbis.dss.etl.DeleteFromImagingDBMaintenanceTask
-    data-source = imaging-db
+```
+class = ch.systemsx.cisd.openbis.dss.etl.DeleteFromImagingDBMaintenanceTask
+data-source = imaging-db
+```
+
      
 
 ## Proteomics Maintenance Tasks
-- 
GitLab