go to post Scott Roth · Nov 30, 2023 We have a shell script that we executes that signs in via Terminal and calls EnableConfigItem to start or stop an Object within IRIS. We found that running this at the OS level allows us to be more multithreaded than the Scheduler within IRIS.
go to post Scott Roth · Nov 28, 2023 Thanks, yes I know /api/monitor/metrics would still be available, I was just wondering on which programs folks were using to ingest the data from /api/monitor/metrics/.
go to post Scott Roth · Nov 17, 2023 I was able to get past the ERROR #5659: Property 'OAuth2.AccessToken::SessionId(6@OAuth2.AccessToken,ID=)' required by specifying an ID at the end of the request... %SYS>set url = ##class(%SYS.OAuth2.Authorization).GetAuthorizationCodeEndpoint("EpicFHIRPOC",scope,OAUTHURL,.properties,.isAuthorized,.sc,,123) so the sc returns 1, however isAuthorized is still returning 0. If I run IsAuthorized, I am not seeing any errors. Am I taking the correct steps? How do I get the Token?
go to post Scott Roth · Nov 9, 2023 It is possible to setup Apache to listen for 52773 instead of 80, so why wouldn't calls to port 52773 go through Apache if it is configured to listen for port 52773?
go to post Scott Roth · Nov 9, 2023 Since everyone on the team uses the URL that contains the port number of 52773, I was trying to make it possible for them not to have to update their bookmarks they already use. Seamless transition to encrypting the traffic between their web browser and the server.
go to post Scott Roth · Oct 30, 2023 We have turned off Telnet, and use ssh to connect to our servers, then open a terminal prompt by running... :>iris session <name space> There are many different clients out there from Windows Terminal, Cygwin, MobaXTerm, XWin32, even Windows Powershell would work with ssh. It all a matter of preference...
go to post Scott Roth · Oct 26, 2023 FHIR is still has the reach the level of maturity that 2.3 had. While the technology is nice, it is still more query based than transactional based in my dealings with understanding the flow. How is an application to know a Patient to query if it does not have enough information to begin the query into FHIR.
go to post Scott Roth · Oct 19, 2023 How do you setup Apache to know the VIP has been moved to one of the other servers? If you include the VIP in the ServerAlias settings in Apache then when a user connects to the VIP, Apache wont know which server to connect to.
go to post Scott Roth · Oct 12, 2023 How did you configure the web gateway to do this? Each web gateway is configured to talk to the local Health Connect instance, irrespective of it being primary, secondary or DR at any time. So, when have to access the primary, we go via the VIP URL -> the request lands on the IIS for the primary instance and that is passed on to the local Health Connect instance.
go to post Scott Roth · Oct 9, 2023 It is something with the password that is setup during the Install process vs the password that is on the user. I installed IRIS with setting the password as a default, verified that I could get into the Web Gateway Management, but as soon as I changed the password through the Security within the Management portal, I could no longer get into the Web Gateway Management. So do I have to modify the CSP.ini somehow to tell it to use the LOCAL password, vs the SYSTEM password?
go to post Scott Roth · Oct 6, 2023 I tracked down the issue to %Service_Login being disabled, as I thought this service was just used for API calls and not internally.
go to post Scott Roth · Oct 6, 2023 _Ensemble is being called when I try to Enable/Disable/Restart an Object within the namespace, I don't think it can be changed.
go to post Scott Roth · Oct 6, 2023 While thinking about this, I am wondering if using an encryption key might be a possible solution as well that way there is limited access to the password, and the key would just have to be regulated to be updated every so often. With using a AD service account, the password still needs to be updated or kept up to date, and still needs to be passed into the shell script for Terminal to open. I have submitted the following IDEA... https://ideas.intersystems.com/ideas/DPI-I-466
go to post Scott Roth · Sep 21, 2023 I have figured out our LDAP configuration to move our users over to use the standard LDAP built in functionality instead of using the ZAUTHENTICATE that I had built.
go to post Scott Roth · Sep 11, 2023 I rewrote my Response class, however now it is returning that it is successful, but does not display it in the trace viewer. Am I missing something in my Response class? Class User.REST.Epic.Msg.GetPatientLocationResponse Extends (%Persistent, Ens.Response, %JSON.Adaptor, %XML.Adaptor) { Parameter %JSONIGNOREINVALIDFIELD As BOOLEAN = 1; Parameter XMLNAME = "Patient.GetPatientLocationByVisit2"; Parameter XMLSEQUENCE = 1; Parameter XMLTYPE = "Patient.GetPatientLocationByVisit2"; Property LastName As %String(%JSONFIELDNAME = "LastName", XMLNAME = "LastName"); Property FirstName As %String(%JSONFIELDNAME = "FirstName", XMLNAME = "FirstName"); Property MiddleName As %String(%JSONFIELDNAME = "MiddleName"); Property Sex As %String(%JSONFIELDNAME = "Sex"); Property DateOfBirth As %String(%JSONFIELDNAME = "DateOfBirth"); Property PatientClass As %String(%JSONFIELDNAME = "PatientClass"); Property EncounterDate As %String(%JSONFIELDNAME = "EncounterDate"); Property ChargeSlipNumber As %String(%JSONFIELDNAME = "ChargeSlipNumber"); Property DepartmentIDs As User.REST.Epic.dt.ArrayOfIDType(%JSONFIELDNAME = "DepartmentIDs", %JSONINCLUDE = "INPUTONLY"); Property FacilityIDs As User.REST.Epic.dt.ArrayOfIDType(%JSONFIELDNAME = "FacilityIDs", %JSONINCLUDE = "INPUTONLY"); Property HospitalAccountIDs As User.REST.Epic.dt.ArrayOfIDType(%JSONFIELDNAME = "HospitalAccountIDs", %JSONINCLUDE = "INPUTONLY"); Property PatientPhoneNumbers As User.REST.Epic.dt.ArrayOfPhone(%JSONFIELDNAME = "PatientPhoneNumbers", %JSONINCLUDE = "INPUTONLY"); Property AttendingPhysician As User.REST.Epic.dt.ArrayOfAttendingPhysician(%JSONINCLUDE = "INPUTONLY"); Property CareTeamPCPs As User.REST.Epic.dt.ArrayOfCareTeamPCP(%JSONINCLUDE = "INPUTONLY"); Property AppointmentSchedules As User.REST.Epic.dt.ArrayOfScheduleProviderReturn(%JSONFIELDNAME = "AppointmentSchedules", %JSONINCLUDE = "INPUTONLY"); Storage Default { <Data name="GetPatientLocationResponseDefaultData"> <Subscript>"GetPatientLocationResponse"</Subscript> <Value name="1"> <Value>LastName</Value> </Value> <Value name="2"> <Value>FirstName</Value> </Value> <Value name="3"> <Value>MiddleName</Value> </Value> <Value name="4"> <Value>Sex</Value> </Value> <Value name="5"> <Value>DateOfBirth</Value> </Value> <Value name="6"> <Value>PatientClass</Value> </Value> <Value name="7"> <Value>EncounterDate</Value> </Value> <Value name="8"> <Value>ChargeSlipNumber</Value> </Value> <Value name="9"> <Value>DepartmentIDs</Value> </Value> <Value name="10"> <Value>FacilityIDs</Value> </Value> <Value name="11"> <Value>HospitalAccountIDs</Value> </Value> <Value name="12"> <Value>PatientPhoneNumbers</Value> </Value> <Value name="13"> <Value>AttendingPhysician</Value> </Value> <Value name="14"> <Value>CareTeamPCPs</Value> </Value> <Value name="15"> <Value>AppointmentSchedules</Value> </Value> </Data> <DefaultData>GetPatientLocationResponseDefaultData</DefaultData> <Type>%Storage.Persistent</Type> } }
go to post Scott Roth · Sep 11, 2023 I have been attempting to try to use ZMIRROR (https://docs.intersystems.com/iris20232/csp/docbook/DocBook.UI.Page.cls?KEY=GHA_mirror_set_config#GHA_mirror_set_tunable_params_zmirror_routine) to execute certain scripting when $$NotifyBecomePrimary is kicked off, however it is still a work in progress. You should be able to call an external script or something to notify you in some fashion that you developed. In our case we have several different notifications available to use via Shell or Perl that could notify us.
go to post Scott Roth · Sep 8, 2023 I updated my User.REST.Epic.Msg.GetPatientLocationResponse that points to User.REST.Epic.dt.Response with the order in which fields are being returned in the JSON that I saw using postman. However now I am receiving... ERROR #9404: Unexpected field in input, LastName, using class base mapping. Method GetPatientLocationVisit2(pRequest As User.REST.Epic.Msg.GetPatientLocationRequest, Output pResponse As User.REST.Epic.Msg.GetPatientLocationResponse) As %Status { #dim tSC As %Status = $$$OK set tHTTPRequest = ##class(%Net.HttpRequest).%New() set tHTTPRequest.SSLConfiguration = ..Adapter.SSLConfig set tHTTPRequest.Https = 1 set tHTTPRequest.WriteRawMode = 1 set tHTTPRequest.Port = ..Adapter.HTTPPort //Do tHTTPRequest.SetHeader("Authorization",..Adapter.Credentials) Do tHTTPRequest.SetHeader("Host",..Adapter.HTTPServer) Do tHTTPRequest.SetHeader("Accept-Encoding","application/json") Do tHTTPRequest.SetHeader("Content-Type","application/json") Do tHTTPRequest.SetHeader("Epic-Client-ID",..EpicClientID) Do tHTTPRequest.EntityBody.Write() do tHTTPRequest.OutputHeaders() set tRequest = ##class(%DynamicObject).%New() set tRequest.PatientID = pRequest.PatientID set tRequest.PatientIDType = pRequest.PatientIDType set tRequest.ContactID = pRequest.ContactID set tRequest.ContactIDType = pRequest.ContactIDType set tRequest.UserID = pRequest.UserID set tRequest.UserIDType = pRequest.UserIDType set tPayload = tRequest.%ToJSON() set tURL= ..Adapter.URL_"/2014/Access/Patient/GETPATIENTLOCATIONBYVISIT2/Visit/Location2" //..Adapter.URL SET tSC = tHTTPRequest.EntityBody.Write(tPayload) set tHTTPResponse = ##class(%Net.HttpResponse).%New() set tSC = ..Adapter.SendFormDataArray(.tHTTPResponse,"POST",tHTTPRequest,,,tURL) set pResponse = ##class(User.REST.Epic.Msg.GetPatientLocationResponse).%New() set tSC = pResponse.%JSONImport(tHTTPResponse.Data) quit tSC } Class User.REST.Epic.Msg.GetPatientLocationResponse Extends (Ens.Response, %JSON.Adaptor) { Property Results As list Of User.REST.Epic.dt.Response; Storage Default { <Data name="GetPatientLocationResponseDefaultData"> <Subscript>"GetPatientLocationResponse"</Subscript> <Value name="1"> <Value>Results</Value> </Value> </Data> <DefaultData>GetPatientLocationResponseDefaultData</DefaultData> <Type>%Storage.Persistent</Type> } } Class User.REST.Epic.dt.Response Extends (%SerialObject, %XML.Adaptor, %JSON.Adaptor) { Parameter %JSONIGNOREINVALIDFIELD As BOOLEAN = 1; Property LastName As %String(%JSONFIELDNAME = "LastName", MAXLEN = ""); Property FirstName As %String(%JSONFIELDNAME = "FirstName", MAXLEN = ""); Property MiddleName As %String(%JSONFIELDNAME = "MiddleName", MAXLEN = ""); Property Sex As %String(%JSONFIELDNAME = "Sex", MAXLEN = ""); Property DateOfBirth As %String(%JSONFIELDNAME = "DateOfBirth", MAXLEN = ""); Property PatientClass As %String(%JSONFIELDNAME = "PatientClass", MAXLEN = ""); Property EncounterDate As %String(%JSONFIELDNAME = "EncounterDate", MAXLEN = ""); Property HospitalService As %String(%JSONFIELDNAME = "HospitalService", MAXLEN = ""); Property ChargeSlipNumber As list Of %String(%JSONFIELDNAME = "ChargeSlipNumber", MAXLEN = ""); Property DepartmentIDs As list Of User.REST.Epic.dt.ArrayOfIDType(%JSONFIELDNAME = "DepartmentIDs"); Property FacilityIDs As list Of User.REST.Epic.dt.ArrayOfIDType(%JSONFIELDNAME = "FacilityIDs"); Property HospitalAccountIDs As list Of User.REST.Epic.dt.ArrayOfIDType(%JSONFIELDNAME = "HospitalAccountIDs"); Property PatientPhoneNumbers As list Of User.REST.Epic.dt.ArrayOfPhone(%JSONFIELDNAME = "PatientPhoneNumbers"); Property AttendingPhysicians As list Of User.REST.Epic.dt.ArrayOfAttendingPhysician(%JSONFIELDNAME = "AttendingPhysicians"); Property ProviderTeams As list Of User.REST.Epic.dt.ArrayOfProviderTeam(%JSONFIELDNAME = "ProviderTeams"); Property CareTeamPCPs As list Of User.REST.Epic.dt.ArrayOfCareTeamPCP(%JSONFIELDNAME = "CareTeamPCPs"); Property AppointmentSchedules As list Of User.REST.Epic.dt.ArrayOfScheduleProviderReturn(%JSONFIELDNAME = "AppointmentSchedules"); Storage Default { <Data name="ResponseState"> <Value name="1"> <Value>LastName</Value> </Value> <Value name="2"> <Value>FirstName</Value> </Value> <Value name="3"> <Value>MiddleName</Value> </Value> <Value name="4"> <Value>Sex</Value> </Value> <Value name="5"> <Value>DateOfBirth</Value> </Value> <Value name="6"> <Value>PatientClass</Value> </Value> <Value name="7"> <Value>EncounterDate</Value> </Value> <Value name="8"> <Value>HospitalService</Value> </Value> <Value name="9"> <Value>ChargeSlipNumber</Value> </Value> <Value name="10"> <Value>DepartmentIDs</Value> </Value> <Value name="11"> <Value>FacilityIDs</Value> </Value> <Value name="12"> <Value>HospitalAccountIDs</Value> </Value> <Value name="13"> <Value>PatientPhoneNumbers</Value> </Value> <Value name="14"> <Value>AttendingPhysicians</Value> </Value> <Value name="15"> <Value>ProviderTeams</Value> </Value> <Value name="16"> <Value>CareTeamPCPs</Value> </Value> <Value name="17"> <Value>AppointmentSchedules</Value> </Value> </Data> <State>ResponseState</State> <StreamLocation>^User.REST.Epic.dt.ResponseS</StreamLocation> <Type>%Storage.Serial</Type> } }
go to post Scott Roth · Sep 8, 2023 it seems the Test LDAP is failing on... the search for SamAccountName, as search AD user of ensemble.Services is showing authenticated and my Base DN for the user search passed. Search user ensemble.Services,DC=OSUMC,DC=EDU authenticatedSearching for user roth16, using SamAccountName=roth16SearchExts error: 1 - Operations errorTest completed The BaseDN and the Nested Group Search BaseDN is the same that I used in my ZAUTHENTICATE. I shouldn't have to remove the ZAUTHENTICATE for the Test LDAP to run should I?
go to post Scott Roth · Sep 7, 2023 Is the attributes listed in the documentation the only attributes that can be configured in /etc/iscagent/iscagent.conf? Does turning the logging help with troubleshooting connection issues on the Arbiter?