Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev #6

Merged
merged 48 commits into from
Aug 31, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
41ac93f
Merge pull request #5113 from nightscout/dev
sulkaharo Dec 17, 2019
f57ccb8
Release 13.0.1 (#5329)
sulkaharo Dec 18, 2019
cd2ad5e
client - mobile - Axis label font is scaled on small screens (#5512)
stephencmorton Feb 16, 2020
77795ca
Split view (#5518)
sulkaharo Feb 16, 2020
729747a
Allow flagging specific settings to be not exposed the /properties an…
sulkaharo Feb 16, 2020
dcf8248
Add more variables to the special list
sulkaharo Feb 16, 2020
43165a0
[DEV][FIX] Fix dbsize plugin to make it hideable again (#5529)
dlvoy Feb 22, 2020
be678c0
Removed duplicate if statement (#5531)
altaired Feb 22, 2020
68fb745
Update Dutch translations (#5532)
Feb 22, 2020
7d95b06
Fix settings test
sulkaharo Feb 22, 2020
32f4791
Update version to 13.1.0
sulkaharo Feb 22, 2020
9611373
Merge branch 'master' into dev for release
sulkaharo Feb 22, 2020
4cdd00d
Fix topbar collapse on small screens (#5562)
sulkaharo Mar 9, 2020
17eb4ae
Option to switch off bolus amount outputs (#5522)
andrew-dixon Apr 14, 2020
7c5a69d
Fix d3 portrait to landscape brush failure (#5638)
jpcunningh May 5, 2020
9236771
Sanitize data from manual careportal entries so only fields with actu…
sulkaharo May 5, 2020
db0e08c
do not redirect to profile editor by default (#5671)
bewest Jun 12, 2020
f3fab56
Fix Issue #5486 - Device Status Days Feature (#5651)
mtfoley Jun 12, 2020
3d6f488
Configurable clock views (#5625)
ireneusz-ptak Jun 12, 2020
5698ae2
Add remote bolus/carbs + otp entry for loop (#5598)
josep1972 Jun 12, 2020
500de79
Sometimes at the very start no profiles provided. (#5591)
GermanBluefox Jun 12, 2020
802d986
Fixes #4991 - Now selects basal profile based day by day (#5572)
fromorbonia Jun 12, 2020
0ae6431
prepare hotfix for MMConnect/EU - 2020-06-28
bewest Jun 28, 2020
f611f1b
bump pointing at right tag
bewest Jun 29, 2020
1062a0d
prepare hotfix for MMConnect/EU - 2020-06-28
bewest Jun 28, 2020
bcd6df2
bump pointing at right tag
bewest Jun 29, 2020
cc1edf2
Merge pull request #5721 from nightscout/wip/bewest/mmconnect-eu
bewest Jun 30, 2020
acf0d39
hotfix attempt 2 - carelink 2020 sso updates
bewest Jun 30, 2020
06982d7
hotfix 3 - attempt 3 at carelink 2020 sso updates
bewest Jun 30, 2020
93c8447
attempt 4 at hotfix for nightscout
bewest Jul 1, 2020
8fba311
hotfix 5 - incorporates latest axios changes
bewest Jul 1, 2020
7283560
Fix for boluscalc issue (#5729)
ireneusz-ptak Jul 2, 2020
9528b79
npm install --save minimed-connect-to-nightscout@^1.4.0
bewest Jul 2, 2020
2fc559e
Change DISPLAY_UNITS to use readENV's default value and added several…
joracine Jul 12, 2020
9b048dd
Fix audit errors, button order (#5694)
sulkaharo Jul 12, 2020
b8e69d9
Fix temporary target cancellation
sulkaharo Aug 18, 2020
356a236
Added documentation on the use of Alpha Testing (#5784)
inventor96 Aug 18, 2020
5ffa5eb
Wip/bewest/mmconnect eu (#5731)
bewest Aug 18, 2020
f4f456a
* Updated several packages to remove issues from NPM audit
sulkaharo Aug 18, 2020
359e6a6
* Limit the default number of profiles returned by the API to fix iss…
sulkaharo Aug 19, 2020
2936559
Upgrade Helmet to 4.0.0
sulkaharo Aug 19, 2020
fd90f4e
CSP and service worker improvements (#5856)
sulkaharo Aug 20, 2020
3e1cc14
Serve the CSP to everyone
sulkaharo Aug 20, 2020
d504a66
Split view CSP support (#5864)
sulkaharo Aug 21, 2020
0c22963
Re-enable CSP configuration (#5867)
sulkaharo Aug 22, 2020
46e3d8f
Merge remote-tracking branch 'official/hotfix/2020-06-28/carelink' in…
bewest Aug 28, 2020
26ebdbd
Bump share2nightscout-bridge plugin
bewest Aug 28, 2020
6613e76
feat Add robots.txt to disallow site crawling
sulkaharo Aug 30, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:

strategy:
matrix:
node-version: [10.x, 12.x]
node-version: [12.x]

steps:
- uses: actions/checkout@v1
Expand All @@ -21,11 +21,11 @@ jobs:
run: npm install
- name: Install MongoDB
run: |
wget -qO - https://www.mongodb.org/static/pgp/server-3.6.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo apt-get install -y --allow-downgrades mongodb-org=3.6.14 mongodb-org-server=3.6.14 mongodb-org-shell=3.6.14 mongodb-org-mongos=3.6.14 mongodb-org-tools=3.6.14
sudo apt-get install -y --allow-downgrades mongodb-org=4.4.0 mongodb-org-server=4.4.0 mongodb-org-shell=4.4.0 mongodb-org-mongos=4.4.0 mongodb-org-tools=4.4.0
- name: Start MongoDB
run: sudo systemctl start mongod
- name: Run Tests
Expand Down
30 changes: 28 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,7 @@ To learn more about the Nightscout API, visit https://YOUR-SITE.com/api-docs/ or
* The `linear` option has equidistant tick marks; the range used is dynamic so that space at the top of chart isn't wasted.
* The `log-dynamic` is similar to the default `log` options, but uses the same dynamic range and the `linear` scale.
* `EDIT_MODE` (`on`) - possible values `on` or `off`. Enables the icon allowing for editing of treatments in the main view.
* `BOLUS_RENDER_OVER` (1) - U value over which the bolus values are rendered on the chart if the 'x U and Over' option is selected. This value can be an integer or a float, e.g. 0.3, 1.5, 2, etc...

### Predefined values for your server settings (optional)
* `INSECURE_USE_HTTP` (`false`) - Redirect unsafe http traffic to https. Possible values `false`, or `true`. Your site redirects to `https` by default. If you don't want that from Nightscout, but want to implement that with a Nginx or Apache proxy, set `INSECURE_USE_HTTP` to `true`. Note: This will allow (unsafe) http traffic to your Nightscout instance and is not recommended.
Expand All @@ -305,11 +306,35 @@ To learn more about the Nightscout API, visit https://YOUR-SITE.com/api-docs/ or

### Views

There are a few alternate web views available from the main menu that display a simplified BG stream. (If you launch one of these in a fullscreen view in iOS, you can use a left-to-right swipe gesture to exit the view.)
Nightscout allows to create custom, simplified views using a predefined set of elements. This option is available under `[+]` link in the main menu.

List of available items:
* `SGV` - Sensor Glucose Value
* `SGV age` - time since the last SGV read
* `SGV delta` - change of SGV in the last 5 minutes
* `Trend arrow` - icon of the SG trend
* `Time` - current time
* `Line break` - invisible item that will move following items to the next line (by default all are showing on the same level)

All visible items have `Size` property which allows to customize the view even more. Also, all items may appear multiple times on the view.

Apart from adding items, it is possible to customize other aspects of the views, like selecting `Color` or `Black` background. The first one will indicate current BG threshold (green = in range; blue = below range; yellow = above range; red = urgent below/above).
`Show SGV age` option will make `SGV age` item appear `Always` or only if the predefined threshold is reached: `Only after threshold`. Breaching `SGV age threshold` will also make `Color` background turn grey and strike through `SGV`.
`Clock view configurator` will generate an URL (available under `Open my clock view!` link) that could be bookmarked.

There are a few default views available from the main menu:
* `Clock` - Shows current BG, trend arrow, and time of day. Grey text on a black background.
* `Color` - Shows current BG and trend arrow. White text on a background that changes color to indicate current BG threshold (green = in range; blue = below range; yellow = above range; red = urgent below/above). Set `SHOW_CLOCK_DELTA` to `true` to show BG change in the last 5 minutes, set `SHOW_CLOCK_LAST_TIME` to `true` to always show BG age.
* `Color` - Shows current BG and trend arrow. White text on a color background.
* `Simple` - Shows current BG. Grey text on a black background.

If you launch one of these views in a fullscreen view in iOS, you can use a left-to-right swipe gesture to exit the view.

### Split View

Some users will need easy access to multiple Nightscout views at the same time. We have a special view for this case, accessed on /split path on your Nightscout URL. The view supports any number of sites between 1 to 8 way split, where the content for the screen can be loaded from multiple Nightscout instances. Note you still need to host separate instances for each Nightscout being monitored including the one that hosts the split view page - these variables only add the ability to load multiple views into one browser page. To set the URLs from which the content is loaded, set:
* `FRAME_URL_1` - URL where content is loaded, for the first view (increment the number up to 8 to get more views)
* `FRAME_NAME_1` - Name for the first split view portion of the screen (increment the number to name more views)

### Plugins

Plugins are used extend the way information is displayed, how notifications are sent, alarms are triggered, and more.
Expand Down Expand Up @@ -550,6 +575,7 @@ For remote overrides, the following extended settings must be configured:
Plugins only have access to their own extended settings, all the extended settings of client plugins will be sent to the browser.

* `DEVICESTATUS_ADVANCED` (`true`) - Defaults to true. Users who only have a single device uploading data to Nightscout can set this to false to reduce the data use of the site.
* `DEVICESTATUS_DAYS` (`1`) - Defaults to 1, can optionally be set to 2. Users can use this to show 48 hours of device status data for in retro mode, rather than the default 24 hours. Setting this value to 2 will roughly double the bandwidth usage of nightscout, so users with a data cap may not want to update this setting.

#### Pushover
In addition to the normal web based alarms, there is also support for [Pushover](https://pushover.net/) based alarms and notifications.
Expand Down
53 changes: 41 additions & 12 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ function create (env, ctx) {
}
});
if (secureHstsHeader) { // Add HSTS (HTTP Strict Transport Security) header

const enableCSP = env.secureCsp ? true : false;

console.info('Enabled SECURE_HSTS_HEADER (HTTP Strict Transport Security)');
const helmet = require('helmet');
var includeSubDomainsValue = env.secureHstsHeaderIncludeSubdomains;
Expand All @@ -37,39 +40,52 @@ function create (env, ctx) {
, preload: preloadValue
}
, frameguard: false
, contentSecurityPolicy: enableCSP
}));
if (env.secureCsp) {

if (enableCSP) {
var secureCspReportOnly = env.secureCspReportOnly;
if (secureCspReportOnly) {
console.info('Enabled SECURE_CSP (Content Security Policy header). Not enforcing. Report only.');
} else {
console.info('Enabled SECURE_CSP (Content Security Policy header). Enforcing.');
}

let frameAncestors = ["'self'"];

for (let i = 0; i <= 8; i++) {
let u = env.settings['frameUrl' + i];
if (u) {
frameAncestors.push(u);
}
}

app.use(helmet.contentSecurityPolicy({ //TODO make NS work without 'unsafe-inline'
directives: {
defaultSrc: ["'self'"]
, styleSrc: ["'self'", 'https://fonts.googleapis.com/', "'unsafe-inline'"]
, styleSrc: ["'self'", 'https://fonts.googleapis.com/', 'https://fonts.gstatic.com/', "'unsafe-inline'"]
, scriptSrc: ["'self'", "'unsafe-inline'"]
, fontSrc: ["'self'", 'https://fonts.gstatic.com/', 'data:']
, fontSrc: ["'self'", 'https://fonts.googleapis.com/', 'https://fonts.gstatic.com/', 'data:']
, imgSrc: ["'self'", 'data:']
, objectSrc: ["'none'"], // Restricts <object>, <embed>, and <applet> elements
reportUri: '/report-violation'
, frameAncestors: ["'none'"], // Clickjacking protection, using frame-ancestors
baseUri: ["'none'"], // Restricts use of the <base> tag
formAction: ["'self'"], // Restricts where <form> contents may be submitted
, objectSrc: ["'none'"] // Restricts <object>, <embed>, and <applet> elements
, reportUri: '/report-violation'
, baseUri: ["'none'"] // Restricts use of the <base> tag
, formAction: ["'self'"] // Restricts where <form> contents may be submitted
, connectSrc: ["'self'", "ws:", "wss:", 'https://fonts.googleapis.com/', 'https://fonts.gstatic.com/']
, frameSrc: ["'self'"]
, frameAncestors: frameAncestors
}
, reportOnly: secureCspReportOnly
}));
app.use(helmet.referrerPolicy({ policy: 'no-referrer' }));
app.use(helmet.featurePolicy({ features: { payment: ["'none'"], } }));
app.use(bodyParser.json({ type: ['json', 'application/csp-report'] }));
app.post('/report-violation', (req, res) => {
if (req.body) {
console.log('CSP Violation: ', req.body)
console.log('CSP Violation: ', req.body);
} else {
console.log('CSP Violation: No data received!')
console.log('CSP Violation: No data received!');
}
res.status(204).end()
res.status(204).end();
})
}
}
Expand All @@ -93,6 +109,11 @@ function create (env, ctx) {
}
app.locals.cachebuster = cacheBuster;

app.get("/robots.txt", (req, res) => {
res.setHeader('Content-Type', 'text/plain');
res.send(['User-agent: *','Disallow: /'].join('\n'));
});

app.get("/sw.js", (req, res) => {
res.setHeader('Content-Type', 'application/javascript');
res.send(ejs.render(fs.readFileSync(
Expand Down Expand Up @@ -171,6 +192,11 @@ function create (env, ctx) {
, title: 'Nightscout translations'
, type: 'translations'
}
, "/split": {
file: "frame.html"
, title: '8-user view'
, type: 'index'
}
};

Object.keys(appPages).forEach(function(page) {
Expand All @@ -179,6 +205,7 @@ function create (env, ctx) {
locals: app.locals,
title: appPages[page].title ? appPages[page].title : '',
type: appPages[page].type ? appPages[page].type : '',
settings: env.settings
});
});
});
Expand Down Expand Up @@ -220,6 +247,7 @@ function create (env, ctx) {
res.sendFile(__dirname + '/swagger.yaml');
});

/* // FOR DEBUGGING MEMORY LEEAKS
if (env.settings.isEnabled('dumps')) {
var heapdump = require('heapdump');
app.get('/api/v2/dumps/start', function(req, res) {
Expand All @@ -230,6 +258,7 @@ function create (env, ctx) {
res.send('wrote dump to ' + path);
});
}
*/

// app.get('/package.json', software);

Expand Down
9 changes: 7 additions & 2 deletions app.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@
"value": "180",
"required": false
},
"BOLUS_RENDER_OVER": {
"description": "U value over which the bolus values are rendered on the chart if the 'x U and Over' option is selected.",
"value": "1",
"required": false
},
"BRIDGE_PASSWORD": {
"description": "Your Dexcom account password, to receive CGM data from the Dexcom Share service. Also make sure to include 'bridge' in your ENABLE line.",
"value": "",
Expand Down Expand Up @@ -99,7 +104,7 @@
},
"ENABLE": {
"description": "Plugins to enable for your site. Must be a space-delimited, lower-case list. Include the word 'bridge' here if you are receiving data from the Dexcom Share service. Include 'mmconnect' if you are bridging from the MiniMed CareLink service.",
"value": "careportal basal",
"value": "careportal basal dbsize",
"required": false
},
"MMCONNECT_USER_NAME": {
Expand Down Expand Up @@ -129,7 +134,7 @@
},
"SHOW_PLUGINS": {
"description": "Default setting for whether or not these plugins are checked (active) by default, not merely enabled. Include plugins here as in the ENABLE line; space-separated and lower-case.",
"value": "careportal",
"value": "careportal dbsize",
"required": false
},
"SHOW_RAWBG": {
Expand Down
4 changes: 2 additions & 2 deletions azuredeploy.json
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@
},
"enable": {
"type": "string",
"defaultValue": "basal bwp cage careportal iob cob rawbg sage iage treatmentnotify boluscalc profile food"
"defaultValue": "basal bwp cage careportal iob cob rawbg sage iage treatmentnotify boluscalc profile food dbsize"
},
"night_mode": {
"type": "string",
Expand All @@ -185,7 +185,7 @@
},
"show_plugins": {
"type": "string",
"defaultValue": "careportal"
"defaultValue": "careportal dbsize"
},
"show_rawbg": {
"type": "string",
Expand Down
20 changes: 20 additions & 0 deletions docs/plugins/googlehome-plugin.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
- [Create Your DialogFlow Agent](#create-your-dialogflow-agent)
- [Do you use Authentication Roles?](#do-you-use-authentication-roles)
- [What questions can you ask it?](#what-questions-can-you-ask-it)
- [Using the Alpha Tester feature](#using-the-alpha-tester-feature)
- [Updating your agent with new features](#updating-your-agent-with-new-features)
- [Adding support for additional languages](#adding-support-for-additional-languages)
- [Adding Google Home support to a plugin](#adding-google-home-support-to-a-plugin)
Expand All @@ -31,6 +32,8 @@ To add Google Home support for your Nightscout site, here's what you need to do:

## Create Your DialogFlow Agent

**BEFORE YOU GET STARTED:** Please read [the section below on the **highly-recommended** use of the Alpha tester feature](#using-the-alpha-tester-feature).

1. Download the agent template in your language for Google Home [here](google-home-templates/).
- If you're language doesn't have a template, please consider starting with [the en-us template](google-home-templates/en-us.zip), then [modifying it to work with your language](#adding-support-for-additional-languages), and [making a pull request](/CONTRIBUTING.md) or [submitting an issue](https://github.com/nightscout/cgm-remote-monitor/issues) with your translated template to share it with others.
1. [Sign in to Google's Action Console](https://console.actions.google.com)
Expand Down Expand Up @@ -80,6 +83,22 @@ If you use Authentication Roles, you will need to add a token to the end of your

See [Interacting with Virtual Assistants](interacting-with-virtual-assistants.md) for details on what you can do with Google Home.

### Using the Alpha Tester feature

If you use your Google Action on the same account as the one you used to create it, you will find that Google disables Test Mode for the action after some period of time, and you have to log in to the Actions console, and open the testing tab to re-enable testing for you to continue to use it. To overcome this limitation, you can use the Alpa Testers feature of Google Actions. To do so, you need to follow a few extra steps:

1. Figure out which Google account you use for your Google Assistant.
1. Use or create a different account to follow the instructions to create your Google Action and DialogFlow agent.
1. Once you verify your Action is working, navigate to the [Actions Console](https://console.actions.google.com/), and open your project.
1. Navigate to the "Deploy" tab, then open the "Release" page in the left navigation pane.
1. Expand the "Alpha" section, then click on the "Create a release" button, and then follow the directions to create a release.
- You may need to fill out some extra information, such as a Privacy Policy ([example](https://docs.google.com/document/d/1RP32ooEol97UyPiJ9vUskhLb6XC6PHhtVTwh0siUZV0/view)), descriptions (e.g. both could be "Tools and stuff to help my partner and I do things better"), and testing instructions (e.g. "Since this is built entirely for myself and my partner, don't expect too much out of this one."). Because this will be for personal use, it's recommended that you keep all of these as vague as possible.
1. Click the "Manage Alpha Testers" button.
1. Enter the email address of the account you use for your Google Assistant (found in step 1). Enter the emails of any other people you would like to have access to talk to your Action (e.g. a spouse).
1. Click the "Save" button.
1. Copy the "Opt-in link" and open it on a device logged in with your account from step 1. Repeat for any other emails you added two steps ago. If the link doesn't work right away, try again in a couple hours.
1. Follow any directions to setup the account as an Alpha Tester.

## Updating your agent with new features

As more work is done on Nightscout, new ways to interact with Nighscout via Google Home may be made available. To be able to use these new features, you first will need to [update your Nightscout site](https://github.com/nightscout/cgm-remote-monitor#updating-my-version), and then you can follow the steps below to update your DialogFlow agent.
Expand All @@ -94,6 +113,7 @@ As more work is done on Nightscout, new ways to interact with Nighscout via Goog
1. Select the template file you downloaded earlier, then type "RESTORE" in the text box as requested, and click the "RESTORE" button.
1. After the import is completed, click the "DONE" button.
1. Make sure to follow any directions specific to the Nightscout update. If there are any, they will be noted in the [release notes](https://github.com/nightscout/cgm-remote-monitor/releases).
1. If you use the Alpha Testers feature (see [Using the Alpha Tester feature](#using-the-alpha-tester-feature) above), create a new release.
1. Enjoy the new features!

## Adding support for additional languages
Expand Down
29 changes: 11 additions & 18 deletions env.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,8 @@ var env = {
};

// Module to constrain all config and environment parsing to one spot.
// See the
// See README.md for info about all the supported ENV VARs
function config ( ) {
/*
* See README.md for info about all the supported ENV VARs
*/
env.DISPLAY_UNITS = readENV('DISPLAY_UNITS', 'mg/dl');

console.log('Units set to', env.DISPLAY_UNITS );

env.PORT = readENV('PORT', 1337);
env.HOSTNAME = readENV('HOSTNAME', null);
env.IMPORT_CONFIG = readENV('IMPORT_CONFIG', null);
Expand Down Expand Up @@ -82,12 +75,6 @@ function setAPISecret() {
var shasum = crypto.createHash('sha1');
shasum.update(readENV('API_SECRET'));
env.api_secret = shasum.digest('hex');

if (!readENV('TREATMENTS_AUTH', true)) {

}


}
}
}
Expand Down Expand Up @@ -125,9 +112,13 @@ function updateSettings() {
UNITS: 'DISPLAY_UNITS'
};

var envDefaultOverrides = {
DISPLAY_UNITS: 'mg/dl'
};

env.settings.eachSettingAsEnv(function settingFromEnv (name) {
var envName = envNameOverrides[name] || name;
return readENV(envName);
return readENV(envName, envDefaultOverrides[envName]);
});

//should always find extended settings last
Expand All @@ -146,11 +137,11 @@ function readENV(varName, defaultValue) {
|| process.env[varName]
|| process.env[varName.toLowerCase()];

if (varName == 'DISPLAY_UNITS' && value) {
if (value.toLowerCase().includes('mmol')) {
if (varName == 'DISPLAY_UNITS') {
if (value && value.toLowerCase().includes('mmol')) {
value = 'mmol';
} else {
value = 'mg/dl';
value = defaultValue;
}
}

Expand All @@ -170,6 +161,8 @@ function findExtendedSettings (envs) {

extended.devicestatus = {};
extended.devicestatus.advanced = true;
extended.devicestatus.days = 1;
if(process.env['DEVICESTATUS_DAYS'] && process.env['DEVICESTATUS_DAYS'] == '2') extended.devicestatus.days = 1;

function normalizeEnv (key) {
return key.toUpperCase().replace('CUSTOMCONNSTR_', '');
Expand Down
Loading