Page History
...
Code Block | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
shrine { pmEndpoint { url = "http://i2b2_node_url:9090/i2b2/services/PMService/getServices" } ontEndpoint { url = "http://i2b2_node_url:9090/i2b2/services/OntologyService" } hiveCredentials { domain = "i2b2demo" username = "demo" password = "demouser" crcProjectId = "Demo" ontProjectId = "SHRINE" } messagequeue { blockingq { serverUrl = "https://shrine-act-test.hms.harvard.edu:6443/shrine-metadata/mom" } } breakdownResultOutputTypes { PATIENT_AGE_COUNT_XML { description = "Age patient breakdown" } PATIENT_RACE_COUNT_XML { description = "Race patient breakdown" } PATIENT_VITALSTATUS_COUNT_XML { description = "Vital Status patient breakdown" } PATIENT_GENDER_COUNT_XML { description = "Gender patient breakdown" } } queryEntryPoint { create = true audit { collectQepAudit = false database { dataSourceFrom = "JNDI" jndiDataSourceName = "java:comp/env/jdbc/qepAuditDB" slickProfileClassName = "slick.jdbc.MySQLProfile$" } } trustModelIsHub = true attachSigningCert = true authenticationType = "pm" //slick.jdbc.H2Profile$ authorizationType = "shrine-steward" queuedQueryPollUrl = "https://your_shrine_url:6443/shrine/rest/i2b2/request" //Change to your url and port number shrineSteward { qepUserName = "qep" //slick.jdbc.PostgresProfile$ qepPassword = "trustme" stewardBaseUrl = "https://localhost:6443" } includeAggregateResults = false //slick.jdbc.SQLServerProfile$ maxQueryWaitTime { minutes = 5 } broadcasterServiceEndpoint { url = "https://shrine-act-test.hms.harvard.edu:6443/shrine/rest/broadcaster/broadcast"slick.jdbc.JdbcProfile$ } } //end queryEntryPoint adapter { create = true audit { collectAdapterAudit = false //slick.jdbc.OracleProfile$ database {} } dataSourceFrom = "JNDI" trustModelIsHub = true jndiDataSourceNameattachSigningCert = "java:comp/env/jdbc/adapterAuditDB"true slickProfileClassNameauthenticationType = "slick.jdbc.MySQLProfile$pm" authorizationType = } } "shrine-steward" crcEndpoint { url queuedQueryPollUrl = "httphttps://i2b2your_nodeshrine_url:90906443/shrine/rest/i2b2/services/QueryToolService" request" //Change to your url and port number shrineSteward }{ adapterLockoutAttemptsThresholdqepUserName = 0"qep" setSizeObfuscation qepPassword = true"trustme" adapterMappingsFileName stewardBaseUrl = "AdapterMappings.csv" https://localhost:6443" maxSignatureAge {} minutesincludeAggregateResults = 5false } maxQueryWaitTime { immediatelyRunIncomingQueriesminutes = true5 } // end adapter} networkStatusQuery = "\\\\SHRINE\\SHRINE\\Demographics\\Gender\\Male\\" humanReadableNodeName = "Harvard Test Node"broadcasterServiceEndpoint { url = "https://shrine-act-test.hms.harvard.edu:6443/shrine/rest/broadcaster/broadcast" } } //end queryEntryPoint adapter { shrineDatabaseTypecreate = "mysql"true keystoreaudit { filecollectAdapterAudit = "/opt/shrine/shrine.keystore" false database password{ = "password" privateKeyAliasdataSourceFrom = "privateKeyAliasJNDI" keyStoreType jndiDataSourceName = "JKSjava:comp/env/jdbc/adapterAuditDB" caCertAliases slickProfileClassName = ["shrine-hub-ca"] "slick.jdbc.MySQLProfile$" } problem { problemHandler = "net.shrine.problem.LogAndDatabaseProblemHandler$" database { dataSourceFrom = "JNDI" //slick.jdbc.H2Profile$ jndiDataSourceName = "java:comp/env/jdbc/problemDB" slickProfileClassName = "slick.jdbc.MySQLProfile$" } } dashboard { happyBaseUrl = "https://localhost:6443/shrine/rest/happy"//slick.jdbc.PostgresProfile$ statusBaseUrl = "https://localhost:6443/shrine/rest/internalstatus" database { dataSourceFrom = "JNDI" jndiDataSourceName = "java:comp/env/jdbc/problemDB" slickProfileClassName = "//slick.jdbc.MySQLProfile$" SQLServerProfile$ } } //end dashboard status { permittedHostOfOrigin = "localhost" } //slick.jdbc.JdbcProfile$ squerylDataSource { database { dataSourceFrom = "JNDI" jndiDataSourceName = "java:comp/env/jdbc/shrineDB"slick.jdbc.OracleProfile$ } } authenticatecrcEndpoint { usersource { domain = "i2b2demo" }url = "http://i2b2_node_url:9090/i2b2/services/QueryToolService" } steward { adapterLockoutAttemptsThreshold createTopicsMode = Approved0 setSizeObfuscation emailDataSteward= {true adapterMappingsFileName sendAuditEmails = false //false to turn off the whole works of emailing the data steward //interval = "1 day" //Audit researchers daily= "AdapterMappings.csv" maxSignatureAge { minutes = 5 } immediatelyRunIncomingQueries = true } // end adapter networkStatusQuery //timeAfterMidnight = "6 hours" //Audit researchers at 6 am. If the interval is less than 1 day then this delay is ignored.= "\\\\SHRINE\\SHRINE\\Demographics\\Gender\\Male\\" humanReadableNodeName = "Harvard Test Node" shrineDatabaseType = "mysql" keystore { //maxQueryCountBetweenAuditsfile = 30 "/opt/shrine/Ifshrine.keystore" a researcher runs more than thispassword many queries since the last audit audit her= "password" privateKeyAlias = "privateKeyAlias" //minTimeBetweenAuditskeyStoreType = "30 daysJKS" //If a researcher runs at leastcaCertAliases one query, audit those queries if this much time has passed = ["shrine-hub-ca"] } problem { problemHandler //You must provide the email address of the shrine node system admin, to handle bounces and invalid addresses //from = "shrine-admin@example.com= "net.shrine.problem.LogAndDatabaseProblemHandler$" database { dataSourceFrom = "JNDI" jndiDataSourceName = "java:comp/env/jdbc/problemDB" slickProfileClassName = "slick.jdbc.MySQLProfile$" //You} must provide the email} address of the data stewarddashboard { happyBaseUrl = "https://to = "shrine-steward@example.comlocalhost:6443/shrine/rest/happy" statusBaseUrl = //subject = "Audit SHRINE researchers" "https://localhost:6443/shrine/rest/internalstatus" database { dataSourceFrom = "JNDI" jndiDataSourceName = "java:comp//The baseUrl for the data steward to be substituted in to email text. Must be supplied if it is used in the email text. env/jdbc/problemDB" slickProfileClassName = "slick.jdbc.MySQLProfile$" //stewardBaseUrl = "https://example.com:6443/steward/" //externalStewardBaseUrl = "https://example.com:6443/steward/" slick.jdbc.H2Profile$ //Text to use for the email audit. //AUDIT_LINES will be replaced by a researcherLine for each researcher to audit//slick.jdbc.PostgresProfile$ //STEWARD_BASE_URL will be replaced by the value in stewardBaseUrl if available. //emailBody = """Please audit the following users at STEWARD_BASE_URL at your earliest convinience: AUDIT_LINES""" //slick.jdbc.SQLServerProfile$ //note that this can be a multiline message //Text to use per researcher to audit//slick.jdbc.JdbcProfile$ //FULLNAME, USERNAME, COUNT and LAST_AUDIT_DATE will be replaced with appropriate text. //researcherLine = "FULLNAME (USERNAME) has run COUNT queries since LAST_AUDIT_DATE. //slick.jdbc.OracleProfile$ } } //end dashboard status { permittedHostOfOrigin = "localhost" } squerylDataSource { database { dataSourceFrom = "JNDI" jndiDataSourceName = "java:comp/env/jdbc/stewardDBshrineDB" slickProfileClassName = "slick.jdbc.MySQLProfile$"} } } // endauthenticate steward{ email { } } // end shrine section |
Changes to i2b2 PM cell database
You will need to remove a primary key constraint within the pm_user_login table in the i2b2pm schema. An unneeded compound primary key limits the PM cell to only processing one authentication attempt per second. In Postgres, remove it with:
...
language | sql |
---|---|
theme | rdark |
...
usersource { domain = "i2b2demo" } } steward { createTopicsMode = Approved emailDataSteward { |
...
|
...
sendAuditEmails = false //false to turn off the whole works of emailing the data steward |
...
//interval = "1 day" //Audit researchers daily |
...
//timeAfterMidnight |
...
= |
...
"6 |
...
hours" //Audit |
...
Allow for More Types of Status from the i2b2 CRC
Change the shrine_query_history's QUERY_RESULT's status column's type from an enum to a text field to accommodate more types from the i2b2 CRC. This will allow some results previously interpreted as errors to be interpreted as 'QUEUED'.
For Mysql:
Code Block | ||||
---|---|---|---|---|
| ||||
mysql> use shrine_query_history;
mysql> alter table QUERY_RESULT change status status varchar(30) not null; |
For Oracle:
Code Block | ||||
---|---|---|---|---|
| ||||
-- To find the constraint name on the status column:
SELECT COLUMN_NAME,CONSTRAINT_NAME,TABLE_NAME FROM user_cons_columns WHERE TABLE_NAME = 'QUERY_RESULT';
-- To drop that constraint:
ALTER TABLE QUERY_RESULT DROP CONSTRAINT <constraint_name_for_status>; |
researchers at 6 am. If the interval is less than 1 day then this delay is ignored.
//maxQueryCountBetweenAudits = 30 //If a researcher runs more than this many queries since the last audit audit her
//minTimeBetweenAudits = "30 days" //If a researcher runs at least one query, audit those queries if this much time has passed
//You must provide the email address of the shrine node system admin, to handle bounces and invalid addresses
//from = "shrine-admin@example.com"
//You must provide the email address of the data steward
//to = "shrine-steward@example.com"
//subject = "Audit SHRINE researchers"
//The baseUrl for the data steward to be substituted in to email text. Must be supplied if it is used in the email text.
//stewardBaseUrl = "https://example.com:6443/steward/"
//externalStewardBaseUrl = "https://example.com:6443/steward/"
//Text to use for the email audit.
//AUDIT_LINES will be replaced by a researcherLine for each researcher to audit.
//STEWARD_BASE_URL will be replaced by the value in stewardBaseUrl if available.
//emailBody = """Please audit the following users at STEWARD_BASE_URL at your earliest convenience: AUDIT_LINES"""
//note that this can be a multiline message
//Text to use per researcher to audit.
//FULLNAME, USERNAME, COUNT and LAST_AUDIT_DATE will be replaced with appropriate text.
//researcherLine = "FULLNAME (USERNAME) has run COUNT queries since LAST_AUDIT_DATE."
}
database {
dataSourceFrom = "JNDI"
jndiDataSourceName = "java:comp/env/jdbc/stewardDB"
slickProfileClassName = "slick.jdbc.MySQLProfile$"
//slick.jdbc.H2Profile$
//slick.jdbc.PostgresProfile$
//slick.jdbc.SQLServerProfile$
//slick.jdbc.JdbcProfile$
//slick.jdbc.OracleProfile$
}
} // end steward
email {
}
} // end shrine section |
Changes to i2b2 PM cell database
You will need to remove a primary key constraint within the pm_user_login table in the i2b2pm schema. An unneeded compound primary key limits the PM cell to only processing one authentication attempt per second. In Postgres, remove it with:
Code Block | ||||
---|---|---|---|---|
| ||||
bash-4.1$ psql
postgres=# \c i2b2pm
i2b2pm=# \d+ pm_user_login
|
For MS SQL Server:
Code Block | ||||
---|---|---|---|---|
| ||||
USE shrine_query_history;
-- To find the constraint name on the status column:
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME= 'QUERY_RESULT';
-- To drop that constraint:
ALTER TABLE QUERY_RESULT DROP CONSTRAINT <constraint_name_for_status>; |
Changes to the context.xml file
In SHRINE 1.25.4, we will need to change context.xml to utilize new parameters as the old ones are going to be deprecated. The old parameters were:
- maxActive
- maxWait
You will now use the new parameters:
- maxTotal
- maxWaitMillis
As part of the changes, here's a sample context.xml file, with the values that you should have:
...
langauge | xml |
---|---|
language | xml |
theme | RDark |
title | context.xml |
collapse | true |
...
Table |
...
"public.pm_user_login" Column | |
...
|
...
|
...
|
...
Type |
...
|
...
|
...
|
...
| Modifiers | Storage |
...
| Description ---------------+-----------------------------+-----------+----------+------------- user_id | character varying(50) |
...
| not null | extended | attempt_cd | |
...
character varying(50) | not null | extended | entry_date | timestamp without time zone | not null | plain | changeby_char | character varying(50) | |
...
|
...
|
...
| extended | status_cd | |
...
character varying(50) | |
...
| extended | Indexes: |
...
|
...
"pm_user_login_pkey" PRIMARY KEY, btree (entry_date, user_id) Has OIDs: no i2b2pm=# ALTER TABLE "pm_user_login" DROP CONSTRAINT "pm_user_login_pkey" ; ALTER TABLE i2b2pm=# \d+ pm_user_login |
...
|
...
|
...
|
...
Table "public.pm_user_login" Column | |
...
|
...
|
...
|
...
|
...
Type | Modifiers | Storage |
...
| Description ---------------+-----------------------------+-----------+----------+------------- user_id | |
...
character varying(50) | not null | extended | attempt_cd | character varying(50) |
...
| not null | extended | entry_date | timestamp without time |
...
zone | not null | plain |
changeby_char | character varying(50) | | extended |
status_cd | character varying(50) | | extended |
Has OIDs: no |
Allow for More Types of Status from the i2b2 CRC
Change the shrine_query_history's QUERY_RESULT's status column's type from an enum to a text field to accommodate more types from the i2b2 CRC. This will allow some results previously interpreted as errors to be interpreted as 'QUEUED'.
For Mysql:
Code Block | ||||
---|---|---|---|---|
| ||||
mysql> use shrine_query_history;
mysql> alter table QUERY_RESULT change status status varchar(30) not null; |
For Oracle:
Code Block | ||||
---|---|---|---|---|
| ||||
-- To find the constraint name on the status column:
SELECT COLUMN_NAME,CONSTRAINT_NAME,TABLE_NAME FROM user_cons_columns WHERE TABLE_NAME = 'QUERY_RESULT';
-- To drop that constraint:
ALTER TABLE QUERY_RESULT DROP CONSTRAINT <constraint_name_for_status>; |
For MS SQL Server:
Code Block | ||||
---|---|---|---|---|
| ||||
USE shrine_query_history;
-- To find the constraint name on the status column:
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME= 'QUERY_RESULT';
-- To drop that constraint:
ALTER TABLE QUERY_RESULT DROP CONSTRAINT <constraint_name_for_status>; |
Changes to the context.xml file
In SHRINE 1.25.4, we will need to change context.xml to utilize new parameters as the old ones are going to be deprecated. The old parameters were:
- maxActive
- maxWait
You will now use the new parameters:
- maxTotal
- maxWaitMillis
Warning | ||
---|---|---|
| ||
If you are using Oracle, please change the driverClassName to "oracle.jdbc.driver.OracleDriver". |
As part of the changes, here's a sample context.xml file, with the values that you should have (assuming MySQL used):
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
<?xml version='1.0' encoding='utf-8'?>
<!-- The contents of this file will be loaded for each web application -->
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/problemDB" auth="Container" type="javax.sql.DataSource"
maxTotal="128" maxIdle="32" maxWaitMillis="10000"
username="shrine" password="demouser" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/shrine_query_history"
testOnBorrow="true" validationQuery="SELECT 1" />
<Resource name="jdbc/shrineDB" auth="Container" type="javax.sql.DataSource"
maxTotal="128" maxIdle="32" maxWaitMillis="10000"
username="shrine" password="demouser" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/shrine_query_history"
testOnBorrow="true" validationQuery="SELECT 1" />
<Resource name="jdbc/adapterAuditDB" auth="Container" type="javax.sql.DataSource"
maxTotal="128" maxIdle="32" maxWaitMillis="10000"
username="shrine" password="demouser" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/adapterAuditDB"
testOnBorrow="true" validationQuery="SELECT 1" />
<Resource name="jdbc/qepAuditDB" auth="Container" type="javax.sql.DataSource"
maxTotal="512" maxIdle="32" maxWaitMillis="10000"
username="shrine" password="demouser" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/qepAuditDB"
testOnBorrow="true" validationQuery="SELECT 1" />
<Resource name="jdbc/stewardDB" auth="Container" type="javax.sql.DataSource"
maxTotal="128" maxIdle="32" maxWaitMillis="10000"
username="shrine" password="demouser" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/stewardDB"
testOnBorrow="true" validationQuery="SELECT 1" />
</Context> |
Info | ||
---|---|---|
| ||
Please note that qepAuditDB is set to 512 connections, which will help in scaling issues for a larger network. |
Changes to the i2b2_config_data.js file
You will need to make a change in the i2b2_config_data.js file, by adding this line of code:
Code Block language bash theme rdark shrineUrl: 'https://your_shrine_url:6443/shrine-metadata/',
Here's the whole i2b2_config_data.js file for reference:
Code Block language bash theme rdark { urlProxy: "/shrine-proxy/request", urlFramework: "js-i2b2/", loginTimeout: 15, // in seconds username_label:"SHRINE ACT Hub username:", //Username Label password_label:"SHRINE ACT Hub password:", //Password Label clientHelpUrl:'help/pdf/shrine-client-guide.pdf', networkHelpUrl:'help/pdf/shrine-network-guide.pdf', wikiBaseUrl:'https://open.med.harvard.edu/wiki/display/SHRINE', obfuscation: 10, resultName: "patients", shrineUrl: 'https://your_shrine_url:6443/shrine-metadata/', // ------------------------------------------------------------------------------------------- // THESE ARE ALL THE DOMAINS A USER CAN LOGIN TO lstDomains: [ { domain: "your domain name", name: "your node name", debug: true, urlCellPM: "http://your_i2b2_url:9090/i2b2/services/PMService/", allowAnalysis: true, isSHRINE: true } ] // ------------------------------------------------------------------------------------------- }
Info | ||
---|---|---|
| ||
Please note that qepAuditDB is set to 512 connections, which will help in scaling issues for a larger network. |
Changes to the i2b2_config_data.js file
- You will need to make a change in the i2b2_config_data.js file, by adding this line of code:
Code Block language bash theme rdark shrineUrl: 'https://your_shrine_url:6443/shrine-metadata/',
Changes to the cell_config_data.js file
...
Code Block | ||||
---|---|---|---|---|
| ||||
files: [ “dist"dist/shrine.bundle.js”js" // “shrine"shrine.controller.js”js", // “i2b2"i2b2_msgs.js”js", // “shrine"shrine.plugin.js”js" ], |
You'll need to add "dist/shrine.bundle.js" under the files section as well as "wrapperHtmlFile: "./js-shrine/shrine.plugin.html"" under the readApprovedURL parameter.
...