New post

Find

Question
· Jun 1

Primary startup failed, failed to read header ..... during Failover

I am attempting to failover my TEST environment to the Backup, and I keep getting an error stating that 

06/01/25-18:47:54:516 (11864) 1 [Utility.Event] Primary startup failed, failed to read header of /archive/journal/MIRROR-IRISTEST-20250513.007 (file #63653)

however, when I go to /archive/journal/, I am not finding any record of MIRROR-IRISTEST-20250513.007 (file #63653)

to get out of this error message I have to restart what was the Primary and restart the Backup to get it back into a state that we can use it. 

There is a Namespace/Database that is on the backup and not part of the mirror, which I need to get moved to being mirrored across all the instances of our TEST environment.

Any idea why it is thinking that /archive/journal/MIRROR-IRISTEST-20250513.007 (file #63653) still exists, and it needs to read from it?
 

1 Comment
Discussion (1)1
Log in or sign up to continue
Announcement
· Jun 1

Developer Community Recap, May 2025

Hello and welcome to the May 2025 Developer Community Recap.
General Stats
142 new posts published in May:
 33 new articles
 47 new announcements
 60 new questions
 2 new discussions
412 new members joined in May
14,991 posts published all time
16,408 members joined all time
Top posts
Top authors of the month
Articles
#InterSystems IRIS
Ladies and Gentlemen, the amazing Iris-nator
By Kurro Lopez
Minify XML in IRIS
By Enrico Parisi
Reviews on Open Exchange - #51
By Robert Cemper
How to produce and consume RabbitMQ messages on IRIS
By Yuri Marx
How to remove special characters (Unicode Characters) from text
By Padmaja Konduru
IRIS iRacing
By sween
Long Running SQL Queries: a sample exploration
By Ben Schlanger
Creating a cross-regional DR Async with IKO
By Sam Ferguson
Building the UI by Prompting vs InterSystems IRIS Backend: Lovable, Spec First and REST API
By Evgeny Shvarov
An Overview of Database Degrade
By Neil Shah
Using %System.Monitor.LineByLine together with %SYS.MONLBL to analyze your code
By Daniel Kutac
A Dive into Debugging Embedded Python
By Shuheng Liu
A knockout of weight
By Andre Larsen Barbosa
codemonitor.MonLBL - Line-by-Line ObjectScript Code Monitoring
By Lorenzo Scalese
Creating a Document Database
By Kate Lau
Multilingual GenerativeAI Pattern Match WorkBench Utility
By Alex Woodhead
Integrate with Google Forms
By Yuri Marx
Use Mako Python template engine to generate dynamic content
By Yuri Marx
Making Sense of Blood Tests with FHIRInsight: Turning FHIR into Clarity
By Henry Pereira
How to manage in a CI/CD pipeline an InterSystems API Manager configuration ?
By Sylvain Guilbaud
hc-export-editor: Making Interface Changes to Exports Before Deploying to Prod
By Eric Fortenberry
Introducing LEAD North's CCD Data Profiling Tool
By Landon Minor
 
#InterSystems IRIS for Health
 
#TrakCare
 
#Other
 
#Open Exchange
 
Announcements
#InterSystems IRIS
[Video] Using Embedded Python in the BPL and DTL Editors
By Adam Coppola
[Video] Prompt the frontend UI for InterSystems IRIS with Lovable
By Anastasia Dyubaylo
Cambridge Developer Meetup - AI Coding Assistants & MCP [May 14 2025]
By Liubov Zelenskaia
[Video] Data Fabric in Practice: Lessons Learned
By Anastasia Dyubaylo
Do you have the InterSystems IRIS SQL Specialist certification? Beta testers needed for our upcoming InterSystems IRIS SQL Professional certification exam
By Celeste Canzano
InterSystems IRIS Development Professional Exam is now LIVE!
By Celeste Canzano
Developing with InterSystems Objects and SQL – In Person June 9-13, 2025 / Registration space available
By Larry Finlayson
GitHub Action IRIS Deployer
By Cristiano Silva
Do you have any openings for InterSystems developer Job
By AYUSH Shetty
InterSystems Platforms Update Q2-2025
By Bob Kuszewski
New Point Release for IRIS 2025.1.0: Critical Interoperability Fix
By Daniel Palevski
[Webinar] Unlocking the Power of InterSystems Data Fabric Studio
By Anastasia Dyubaylo
SQL DATA LENS Now FREE for Use with InterSystems IRIS Community Edition!
By Andreas Schneider
Hebrew Webinar: Discover the All-New UI in Version 2025.1 — and More!
By Ronnie Hershkovitz
 
#Developer Community Official
 
#Open Exchange
 
#InterSystems IRIS for Health
 
#Summit
 
#IRIS contest
 
#HealthShare
 
#Other
 
#Learning Portal
 
#InterSystems Ideas Portal
InterSystems Ideas News #22
By Irène Mykhailova
 
#InterSystems Official
IKO 3.8 Release
By Bob Kuszewski
 
Questions
#InterSystems IRIS
Embedded Python query
By Touggourt
Best Practice for Existing ODBC Connection When System Becomes IRIS for HealthShare
By Fraser J. Hunter
SQLCODE: -99 when executing dynamic SQL on specific properties
By Martin Nielsen
Rule Editor Login Credentials Issue in Community Edition
By Juan Mota Sanchez
Problem exporting %Library.DynamicObject to JSON with %JSON.Adaptor
By Marcio Coelho
Task Scheduler - Output to file
By Scott Roth
InterSystems HL7 Interface Specialist certificate test
By Yuhong Snyder
Troubleshooting REST Operation
By Scott Roth
How to prevent reentrancy inside same process ?
By Norman W. Freeman
Actual Use Cases for %Stream.DynamicBinary and %Stream.DynamicCharacter
By Ashok Kumar T
How can I call $System.OBJ.Load() from a linux shell script? (Or $System.OBJ.Import, instead)
By AC Freitas
How to delete table column with its data with SQL command. I need the exact syntax of the command
By Dmitrij Vladimirov
Using assign in a routing rule using XML
By Ewan Whyte
Embedded SQL result issues inside %ZLANGC routine
By Ashok Kumar T
Age Calculator in BPL
By Saju Abraham
JSON - is key defined?
By Scott Roth
Problem deploying to a namespace
By Anthony Decorte
Error Handling Server to Client Side - Best Practices
By Michael Davidovich
ERROR #5883: Item '%Test' is mapped from a database that you do not have write permission on
By Jonathan Perry
Outbound HL7 HTTP Messaging - Unsupported Media Type
By Scott Roth
Append a string in a update query
By Jude Mukkadayil
Task manager in async mirror behavior
By Yaron Munz
Take subroutines from the Deployed Mode Routine
By Ashok Kumar T
%JSON.Adaptor compilation issues under array-of-streams and computed property types
By Geoffrey Lu
REST API Issue
By Anil Mathew
BI Analytics default key:value pair in termlist
By Dmitrij Vladimirov
%Stream files do not get purged from the /stream/ folder on the system disk
By Martin Nielsen
Poor database write performance
By Norman W. Freeman
Users in write only
By Pietro Montorfano
How to override the port used on a SOAP operation
By Ryan Hulslander
Download
By chris Janidas
Subscript indirection behaves differently in if statement
By Ashok Kumar T
CSP WebApp - IIS
By Patrik Spisak
No whens matched and no otherwise defined
By Avishek Singh
SQL Query returns with OFFSET
By Fabio Care
How to programmatically create SQL Gateway Connection?
By Jani Hurskainen
How to use EnsLib.SQL.InboundAdapter in IRIS tables
By Kurro Lopez
What is the global ^Ens.AppData and is it secure kill it?
By Yuri Marx
JSON - Field extraction using Object Script
By Scott Roth
How to reset the Web Gateway management Password
By Thembelani Mlalazi
Prompt Engineering for ollama-ai-iris
By Oliver Wilms
How can I configure InterSystems ObjectScript Source Control with a client-side workspace in VS Code?
By Ricardo Alves dos Santos
Azure OpenAI %Embedding.Config
By Henry Pereira
Production Validator - Case Study
By Satya Prasad Kalam
 
#InterSystems IRIS for Health
 
#Caché
 
#TrakCare
 
#Health Connect
 
#HealthShare
 
#Ensemble
 
Discussions
#InterSystems IRIS
 
#Global Masters
 
May, 2025Month at a GlanceInterSystems Developer Community
Discussion (0)1
Log in or sign up to continue
Article
· Jun 1 18m read

¡POLICIA POLICIA! ¡¡Hay un intruso!! (Notificaciones Telegram y manejo URLs OAUTH2)

Buenas a todos,

en capítulos anteriores, vimos como "Proteger los datos: Se un mejor cerrajero", en el que explicábamos como proteger nuestros recursos aplicando un control extra al acceso mediante OAUTH2 que nos ofrece Intersystems. Y como no hay 2 sin 3, aquí tenemos un tercer articulo, en el cual vamos a explicar como "avisar a la policía" de que alguien malicioso está intentando acceder a nuestros datos.

Al finalizar el mismo, comentábamos que si quisiéramos podríamos tener un mayor control de estos accesos incorrectos y esto nos lleva a este artículo, por lo que seguiremos el siguiente índice, en el cual podréis encontrar todos los apartados en formato tutorial, de forma que siguiendo paso a paso lograreis llegar al objetivo:

1.- Introducción

   1.1.- De donde venimos

2.- Configuración del "091" 

2.1.- Arquitectura de las alertas

2.2.- ¿Quién es quién?

       2.2.1.- Operación
       2.2.2.- Proceso

   2.3.- ¿Qué es un bot de telegram?  

       2.3.1.- Bot  
       2.3.2.- Grupos
       2.3.3.- Configuración de la alerta

3.- Actualización de consulta de usuario

3.1.- Usuario de nuestro token por Endpoints Relacionados con Autenticación (OAUTH)

3.2.- Endpoints útiles para OAUTH

       3.3.1.- token
       3.3.2.- introspection
       3.3.3.- registration
       3.3.4.- revocation

 

1.- Introducción

1.1.- De donde venimos

En el articulo anterior (Proteger los datos: Se un mejor cerrajero) explicábamos como conocer el usuario ("2.1.- ¿Cómo funciona la llave (Token)?") mediante el uso de JWT extrayendo el parámetro "aud" y en base a este valor validábamos por LookUp Table su permiso de acceso a unos recursos o no. Si un usuario no esta autorizado a acceder a determinados recursos, necesitamos saber de estos intentos maliciosos de acceso para poder actuar.

En los siguientes pasos explicaremos la configuración de las alertas por mensajería push así como mejorar la obtención del usuario y mas funciones de las URLS de OAUTH2.

Estas alertas por mensajería push las realizaremos por medio de Telegram, aplicación de mensajería instantánea que nos permite recibir mensajes de texto en tiempo real. Este es el gran punto a su favor para esta situación, pues en el mismo momento que ocurra un intento indebido de acceso a nuestros recursos, lo sabremos y podremos actuar lo antes posible para proteger nuestros datos. Al mismo tiempo, al utilizar una aplicación de este tipo, podremos recibir la notificación en cualquier lugar del mundo, pues, mientras tengamos conexión a internet, esta notificación nos va a llegar. 

Con todo esto, ¡VAMOS AL LIO!

2.- Configuración del "091" 

   2.1.- Arquitectura de las alertas



Partimos de un esquema como el mostrado, donde queremos generar un aviso a nuestro dispositivo móvil en el momento en el que detectemos que hay algún problema, en este caso, un acceso indebido a nuestros recursos.

Por lo tanto, teniendo ya montada nuestra integración, lo que vamos a hacer ahora es añadir un modulo de alertas para Telegram. Este modulo consistirá en 2 componentes principales:

Nombre del Componente

Descripción del Componente

Operaciones.Notificaciones.Telegram

Operación preconfigurada para realizar notificaciones urgentes vía Telegram desde el ESB.

Proceso.Notificaciones.Telegram

Proceso que orquestará los diferentes tipos de notificaciones REST vía Telegram.

 

2.2.- ¿Quién es quién?

2.2.1.- Operación
Nuestra operación de envío de alertas a Telegram realizará notificaciones REST vía Telegram. Esta operación “simulara” ser un bot en la aplicación de Telegram y desde el ESB se controlará este bot, que emitirá las notificaciones a los grupos y/o personas según los acuerdos alcanzados para cada caso. Estas notificaciones serán inmediatas pudiendo aplicar un control temporal para no saturar los dispositivos móviles de las personas notificadas.

Estas notificaciones podrán sustituir y/o complementar a las alertas ya vigentes (correo electrónico). Ya que su objetivo es que las personas responsables de cada aplicativo sean informadas lo antes posible de problemas ocurridos.

2.2.2.- Proceso
Nuestro proceso orquestará la configuración y parametrización de las notificaciones REST vía Telegram. Las diferentes casuísticas que consideremos realizarán llamadas a este proceso enviando la información solicitada para cada caso y este proceso preparará los mensajes personalizados para cada caso.

Llegados a este punto, sabemos que vamos a utilizar una operación rest para notificar vía Telegram, pero nos queda explicar lo mas importante, ¿Qué es un bot de telegram? A continuación lo explicamos.

 

2.3.- ¿Qué es un bot de telegram?

Para la notificación instantánea de mensajería que se pretende implantar haremos uso de una de las principales funcionalidades de código abierto que nos da la API de Telegram como es la creación y administración de bots.

2.3.1.- Bot

Un bot es una funcionalidad de Telegram, la cual consiste en la creación de un perfil de usuario de Telegram que se controla por terceros gracias a unos parámetros de configuración definidos por la API. Esta funcionalidad simula ser un usuario de Telegram, y como todo usuario, puede enviar mensajería a través de la aplicación por medio de configuraciones del bot. En el ESB configuraremos este bot para que de forma automatizada envíe notificaciones a los diversos grupos que se hayan acordado.

Para la creación de un bot que utilizaremos para enviar notificaciones vía Telegram, será necesario hacer uso de la funcionalidad ofrecida por el @botfather de Telegram.

El @botfather es una funcionalidad de Telegram para controlar a otros bots y crearlos por cuenta propia y es una de las recomendaciones de los responsables de Telegram para crear de una forma más fácil tu propio bot. Esta funcionalidad dispone de una variedad amplia de comandos para configurar nuestro bot.

Para empezar a crear nuestro bot, deberemos de seguir los siguientes pasos (7):

 
Spoiler

2.3.2.- Grupos
Para realizar las notificaciones se hará mediante grupos privados de Telegram, en los cuales se incluirá en cada grupo a las personas acordadas. 

Para crear un grupo deberemos abrir la aplicación de Telegram y seguir los siguientes pasos:

 
Spoiler

2.3.2.- Configuración de la alerta

Ahora que ya tenemos nuestro bot y nuestro grupo de Telegram donde van a llegar las notificaciones, debemos orquestar en el ESB como enviarlas. 

Os dejo por aquí un esqueleto de operación de envío de peticiones:

 
Spoiler

En la misma podéis observar que se necesita atacar a la URL con unos parámetros determinados:

https://api.telegram.org/bot1234567890:[TOKEN]/sendMessage?chat_id=[CHATID]&text="_pRequest.mensaje

En este punto, podemos ver que hay un valor que no disponemos, que es el CHAT ID. Este valor es muy fácil de obtener, pues con reenviar un mensaje desde nuestro nuevo grupo al @userinfobot de Telegram, este nos devolverá el ID del grupo como muestro a continuación:

 

La producción nos debería quedar algo así:

Una vez enviamos la petición REST desde el ESB, podemos ver la notificación en el Telegram.

Esta operación nos vale para todo caso que queramos notificar, pues el Proceso anteriormente indicado, será el encargado de orquestar a que grupo llamar (CHAT ID) y que mensaje enviar (adaptado a cada caso), De forma que podamos tener N grupos y N mensajes diferenciados utilizando el mismo Bot.

A continuación os dejo un breve video explicativo del proceso completo:

 

Como podéis observar, siguiendo los pasos de esta guía, podréis notificar a quien queráis de cualquier cuestión que ocurra en el ESB de forma inmediata. ¡Así que espero que os sea de ayuda!

No puedo terminar este articulo sin incluir una mejora del articulo anterior, y esta es la utilización de la consulta del usuario así como el uso de algunas de las URLs que nos ofrece el servidor OAUTH2 de Intersystems. Todo esto lo explicamos a continuación.

 

3.- Actualización de consulta de usuario

3.1.- Usuario de nuestro token por Endpoints Relacionados con Autenticación (OAUTH)

A continuación os explico una forma mas sencilla y reutilizable de obtener este dato de forma que podamos aplicarlo para múltiples procesos.

En el primer articulo ("Como controlar el acceso a tus recursos con OAuth2") en el que explicábamos como preparar el servidor OAUTH2 de Intersystems, indicábamos que la URL del servidor era:

     https://DNS/IP:57773/oauth2

Una vez creamos el servidor, en su configuración podemos ver:

Sistema > Gestión de seguridad > Cliente de OAuth 2.0 > Descripción del servidor  - (Configuración de seguridad)   

 
Spoiler

Como vemos, hay varias URLs que nos crea el servidor. Una de ellas es para consultar la información del usuario (userinfo) en OAuth 2.0, podemos utilizar la siguiente URL:

           https://DNS/IP:57773/oauth2/userinfo

El procedimiento a seguir es enviar una solicitud GET al punto final UserInfo, incluyendo el token de acceso en el encabezado de la solicitud de autorización. El encabezado suele ser "Authorization: Bearer [token_de_acceso]". Para ello os muestro el paso a paso:

Obtener el Token para el usuario "bezkfeZoA3mU2g1dmABlvgv9k1AKHN78JtIgXgcdQeQ":

 
Spoiler

Utilizando este Token hacia la URL de UserInfo obtenemos el usuario:

 
Spoiler

Como podéis ver, con un simple GET a esa URL y el token que ya disponemos, nos devuelve "sub" que es el "aud" que obteníamos por el JWT. De forma que podemos montarnos una operación REST en el ESB que realice esta operación y tendremos la respuesta inmediata.

Os dejo por aquí una estructura de una operación REST para que podáis estructurar vuestras pruebas:

 
Spoiler

 

3.2.- Endpoints útiles para OAUTH

La URL del UserInfo la podemos obtener llamando a la URL:

     https://DNS/IP:PUERTO/oauth2/.well-known/openid-configuration

La cual nos entrega el siguiente JSON que os sonará:

 
Spoiler

En esta lista de URLs vemos algunas interesantes como son:

"userinfo_endpoint" : "https://DNS/IP:PUERTO/oauth2/userinfo"
"token_endpoint" : "https://DNS/IP:PUERTO:57776/oauth2/token"
"introspection_endpoint" : "https://DNS/IP:PUERTO/oauth2/introspection"
"registration_endpoint" : "https://DNS/IP:PUERTO/oauth2/register"
"revocation_endpoint" : "https://DNS/IP:PUERTO/oauth2/revocation"

2.3.1.- token

La URL "userInfo" ya le hemos explicado en este articulo, por lo que a continuación vamos a explicar "token_endpoint"; pues es la que utilizamos en capítulos anteriores para obtener el token.

Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/token" deberemos realizar un GET con los siguientes parámetros de configuración:

 
Spoiler

3.3.2.- introspection
La siguiente URL que vamos a explicar es "introspection_endpoint". Que es la que nos permite validar un token en el servidor de autorización para verificar su estado y obtener más detalles sobre él (como sus permisos, emisor, usuario asociado, etc.). Este endpoint normalmente se utiliza en arquitecturas donde un recurso protegido requiere verificar la validez de un token antes de otorgar acceso.

Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/introspection" deberemos realizar un POST con los siguientes parámetros de configuración:

 
Spoiler

3.3.3.- registration

La siguiente URL que vamos a explicar es "registration_endpoint" . Este endpoint permite que las aplicaciones cliente dinámicamente se registren en el servidor de autorización sin necesidad de configurar manualmente las credenciales en el servidor.

Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/register" deberemos realizar un POST con los siguientes parámetros de configuración:

 
Spoiler

3.3.4.- revocation

La siguiente URL que vamos a explicar es "revocation_endpoint". Que es el endpoint definido en el estándar OAuth 2.0 que permite revocar tokens emitidos previamente por un servidor de autorización

Para consumir la URL "https://DNS/IP:PUERTO:57776/oauth2/revocation" deberemos realizar un POST con los siguientes parámetros de configuración:

 
Spoiler

Con esta revocación del token termina este articulo. Espero que les sea de utilidad y les sirva para ponerse al día en cuanto a aplicación de seguridad en nuestras plataformas, pues todo esto lo podemos gestionar desde nuestro portal de gestión de Intersystems.

Finalmente, espero que se conviertan ¡en el mejor equipo de seguridad posible!

Muchas gracias por el tiempo que han dedicado a esta lectura.
 

1 new Comment
Discussion (4)3
Log in or sign up to continue
Article
· Jun 1 3m read

IRIS Interop DevTools: A Jumpstart into IRIS Transformations for CCDA and FHIR

IRIS supports CCDA and FHIR transformations out-of-the-box, yet the ability to access and view those features requires considerable setup time and product knowledge. The IRIS Interop DevTools application was designed to bridge that gap, allowing implementers to immediately jump in and view the built-in transformation capabilities of the product. 

In addition to the IRIS XML, XPath, and CCDA Transformation environment, the Interop DevTools package now provides:

  • FHIR-SDA Transformation setup
  • SDA-FHIR Transformation setup
  • Bubbling up of FHIR validation errors
  • Loading of required context for FHIR transforms

The look and feel of the dashboard has been updated to be more intuitive and user-friendly. Execution occurs within IRIS in order to leverage the environment, while the UI allows visibility, repeatability, and the ability to isolate modifications and modules for testing.

There are five utilities:

1. XPath Evaluator: Evaluates an XPath against an input CCD and returns result

2. CCDA to SDA Transform: Runs an input CCD through the selected base XSL transform and displays SDA result. 

3. XSL Template Tester: Applies a single XSL template against an input CCD and displays the resulting CCD. 

4. FHIR to SDA Transform: Runs the standard FHIR to SDA transform on an input FHIR resource or bundle and displays SDA result or FHIR validation error response. 

5. SDA to FHIR Transform: Runs the standard SDA to FHIR transform on an input SDA message and displays FHIR Bundle result.

 Getting Started:

1. IRIS Interop DevTools is available for download on the Open Exchange

2. Once installed, the UI runs in a Docker container. Follow the instructions in the README to build and start docker. (Additional instructions are included in the README for MacOS users). 

3. Open the UI at: http://localhost:4000  

For local installation

The application is built to run on Docker on an IRIS for Health community image, however the solution only requires a Foundation namespace and is compatible with HealthConnect, IRIS for Health, or HealthShare UCR.

1. The backend IRIS web application and REST APIs is available for installation via IPM.

From IRIS terminal:

zpm "install iris-ccd-devtools"

2. The front-end application can be installed locally by changing directories to the  "frontend/CCD-Tools-Frontend" folder and then running the following commands:

  • npm install
  • npm rundev

3. Open the UI at: http://localhost:4000  

Sample Data

There is anonymized sample data loaded in the testing folder. There are also two Postman collections for testing the backend APIs. The interop-devtools-ccd-fhir.postman_collection.json contains the updated FHIR-SDA APIs. 

Running The Toolset

Upload or paste the contents from the appropriate sample file in order to test each tool. 

Example for the FHIR to SDA transform tester:

 

Let us know what you think. Is a toolset like this useful for what you do? What features would be useful in the future? We look forward to continuing to enhance the toolset in our Innovations group. 

Discussion (0)1
Log in or sign up to continue
Digest
· Jun 1

Resumo do InterSystems Developer Community, Maio 2025

Olá e bem-vindo ao boletim informativo da comunidade de desenvolvedores Maio 2025.
Estatísticas gerais
18 novas postages publicadas em Maio:
 13 novos artigos
 1 new announcement
 3 novas perguntas
 1 new discussion
3 novos membros ingressaram em Maio
1,376 postagens publicadas ao todo
628 membros ingressaram ao todo
Principais publicações
Principais autores do mês
Artigos
#InterSystems IRIS
#InterSystems IRIS for Health
#TrakCare
Anúncios
#InterSystems IRIS
Perguntas
Discussões
Maio, 2025Month at a GlanceInterSystems Developer Community