28 septembre 2022

Reinitialiser les mots de passe de eDSN en mode commande

L'utilisateur de eDSN peut modifier son mot de passe via l'interface ... s'il a réussi à se connecter !

S'il faut le réinitialiser, l'usage est de se connecter au serveur et de mettre à jour le fichier XML de configuration des comptes.

.../conf/ grep Digix users.xml

    <user id="Digix" firstName="Di" lastName="Gix" password="dummy">


Une commande a été mise à disposition depuis eDSN 8 pour le modifier depuis la console SSH. Comme pour l'IHM, il est nécessaire de connaitre l'ancien :

edsn>usermanager:change-password Digix

Ancien mot de passe :****

Nouveau mot de passe :*****

Confirmation du nouveau mot de passe :*****

Le mot de passe a été changé

edsn>

Le fichier a été mis à jour et le mot de passe est chiffré :

    <user id="Digix" firstName="Di" lastName="Gix" password="{CRYPT}PCNY5VyVhXY+FnUph1L7nGQ/Wc1pmofjFe4MCROoMS+BoTshxymSX9TkTXOc3ewH{CRYPT}">


NB : Si un addon d'authentification spécifique a été mis en place, la commande appellera la méthode de changement de mot de passe - pour peut qu'elle ait été développée ...

27 septembre 2022

Requêtes SQL sur les processus de workflow ACTIVITI de eDSN

eDSN fonctionne avec des processus de workflow. Ces derniers sont gérés par l'open source ACTIVITI.
Pour lister les processus en cours, il est donc possible de le faire par SQL dans les tables ACT_*

Quelques éléments donnés par la doc ACTIVITI :

The database names of Activiti all start with ACT_. The second part is a two-character identification of the use case of the table. This use case will also roughly match the service API.

  • ACT_RE_*: RE stands for repository. Tables with this prefix contain static information such as process definitions and process resources (images, rules, etc.). 
  • ACT_RU_*: RU stands for runtime. These are the runtime tables that contain the runtime data of process instances, user tasks, variables, jobs, etc. Activiti only stores the runtime data during process instance execution, and removes the records when a process instance ends. This keeps the runtime tables small and fast. 
  • ACT_ID_*: ID stands for identity. These tables contain identity information, such as users, groups, etc. (absentes sur eDSN) 
  • ACT_HI_*: HI stands for history. These are the tables that contain historic data, such as past process instances, variables, tasks, etc. (absentes sur eDSN) 
  • ACT_GE_*: general data, which is used in various use cases.

Par exemple, pour comptabiliser les processus et tâches en cours :

set markup csv on quote off
select regexp_substr(PROC_DEF_ID_,'^[^:]+:'),TASK_DEF_KEY_,count(*) from act_ru_task group by regexp_substr(PROC_DEF_ID_,'^[^:]+:'), TASK_DEF_KEY_ order by 1,2;
controlReport:,consultControlReport,47
flowFile:,consultFlowFile,4
manageSignalementEnvoi:,downloadSignalementEnvoi,9
monthlyDeclaration:,manageDeclarationCancel,1
monthlyDeclaration:,manageDeclarationError,2
monthlyDeclaration:,validateDeclaration,1477
signalementDeclaration:,manageSignalement,10
signalementDeclaration:,manageSignalementError,96
synchronizeSignalement:,consultSynchronizeSignalement,63
temporaryDeclaration2:,consultErroneousTemporaryDeclaration,22
temporaryDeclaration2:,consultTemporaryDeclaration,10378
uncertifiedCancelAndReplaceDeclaration:,manageUncertifiedCancelAndReplaceDeclarationError,2
uncertifiedDeclaration:,manageUncertifiedDeclarationError,3
uncertifiedSignalementDeclaration:,manageUncertifiedSignalementError,63
uncertifiedSignalementDeclaration:,validateUncertifiedSignalement,2

Noter qu'un nombre important de processus en cours va impacter négativement les performances batch et transactionnelles de eDSN. Pour purger les processus orphelins (faisant référence à une déclaration qui n'existe plus), l'application fournit une commande qu'il est intéressant d'automatiser :

admin:purge-orphans [-p SSAAMM]

Pour visualiser les messages d'erreur des processus :

select substr(J.PROCESS_INSTANCE_ID_,1,10) , regexp_substr(J.PROC_DEF_ID_,'^[^:]+:'), '-' , substr(J.EXCEPTION_MSG_,1,200)||'...'  from ACT_RU_JOB J where J.EXCEPTION_MSG_ is not NULL;
135011326  signalementDeclaration:                                          - Unknown property used in expression: ${setSignalementToBeSentStatusDelegate}...
136827668  controlReport:                                                   - Unknown property used in expression: ${deleteControlReportDelegate}...

 

Afficher en ligne toutes les propriétés (text_) du processus d'un workflow (ici 138338880) :

select proc_inst_id_, listagg(name_||'='||text_,' ') within group (order by name_) from act_ru_variable
 where proc_inst_id_ =
138338880 group by proc_inst_id_;

138338880
adminContentPath=synchronizeSignalementReports/admin/ARRET_TRAVAIL/138338880.csv beginDateRefresh= consideredEventCount=1355 done= format=csv generationDate= groups=nogroup koEventCount=17 lastInvolvedUser=admin maxDate=2022-10-24T03:03:09Z month=9 okEventCount=18 periodeDsn= processCreationDate=2022-09-24-05:02:19 processCreator=admin requestDate= signalementType=ARRET_TRAVAIL totalEventCount=1390 userContentPath=synchronizeSignalementReports/admin/ARRET_TRAVAIL/138338880.csv userId=admin year=2022

Ainsi, pour repérer un processus orphelin :

select proc_inst_id_ from act_ru_variable where name_ = 'declarationTechnicalId' and text_ not in (select id from dsndeclaration);

Ou avec ses propriétés :
select v.proc_inst_id_, listagg(v.name_||'='||v.text_,' ') within group (order by v.name_) from edsn.act_ru_variable v
join edsn.act_ru_variable w on v.proc_inst_id_ = w.proc_inst_id_ and w.name_ = 'declarationTechnicalId'
where w.text_ not in (select id from dsndeclaration) group by v.proc_inst_id_;

(pour les processus d'envoi, la liste des Id est stockée en hexadecimal dans une table ACT_GE_BYTEARRAY ... pas très lisible !)

Pour repérer les actions automatiques (réglées sur un timer ACTIVITI) et leur échéance :

select J.DUEDATE_ echeance, J.PROCESS_INSTANCE_ID_ pid, REGEXP_SUBSTR(J.PROC_DEF_ID_,'^[^:]+:') process_type, V.NAME_, V.TEXT_
from ACT_RU_JOB J
left outer join ACT_RU_VARIABLE V
on J.PROCESS_INSTANCE_ID_ = V.PROC_INST_ID_ and V.NAME_ in ('declarationTechnicalId','fluxId','contentPath','userContentPath')
where J.TYPE_='timer' and TEXT_ is not null
order by 1,3

ECHEANCE,PID,PROCESS_TYPE,NAME_,TEXT_
2027-09-26-00.00.00,61537997,signalementDeclaration:,declarationTechnicalId,de5e85b8-7b10-40cf-8316-a1f82d1f7651
2022-09-27-15.40.22,62638457,controlReport:,contentPath,controlReports/202209/john.doe@acme.com/messages-62638457.csv
2022-09-28-17.51.33,62593312,flowFile:,contentPath,flows/202208/flux_62593312_42206902100034-NET-1.dsn
2022-10-23-03.51.27,62640501,monthlyDeclaration:,declarationTechnicalId,05744771-8d5f-46bb-8f89-871418b8b794