u2a 3.5.5 → 3.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +9 -4
- package/src/commands/configure.js +184 -184
- package/src/utils/app.js +243 -243
- package/src/utils/appGenerator.js +124 -124
- package/src/utils/builder.js +125 -125
- package/src/utils/config.js +3 -3
- package/src/utils/logger.js +1 -1
- package/src/utils/noroot.js +41 -41
- package/src/utils/osIntegration.js +187 -187
- package/src/utils/postinstall.js +156 -156
- package/src/utils/sanitize.js +20 -20
- package/src/utils/securexec.js +12 -12
- package/src/utils/settings.js +114 -114
- package/src/utils/upgradeLA.js +140 -140
- package/src/utils/url.js +12 -9
- package/src/utils/versionCheck.js +149 -149
- package/.github/workflows/npm-publish.yml +0 -22
package/src/utils/postinstall.js
CHANGED
|
@@ -1,157 +1,157 @@
|
|
|
1
|
-
// Todo: autoupgrade for installed localapps, will be useful if we change file structure
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const path = require('path');
|
|
6
|
-
const axios = require('axios');
|
|
7
|
-
const Logger = require('./logger');
|
|
8
|
-
const { setupConfig, CONFIG_DIR } = require('./config');
|
|
9
|
-
const { initSettings, getSetting } = require('./settings');
|
|
10
|
-
const { upgrade } = require('./upgradeLA');
|
|
11
|
-
|
|
12
|
-
setupConfig(); // builds ~/.u2a/*
|
|
13
|
-
|
|
14
|
-
const logger = new Logger('postinstall');
|
|
15
|
-
const postinstallJsonPath = path.join(CONFIG_DIR, 'postinstall.json');
|
|
16
|
-
let isUpgrade = false;
|
|
17
|
-
let currentVersion = '0.0.0'; //0.0.0 for new installations
|
|
18
|
-
let sendAnonReports = true; // u2a configure reports disable to disable
|
|
19
|
-
|
|
20
|
-
const formatVersionLine = (label, version) => {
|
|
21
|
-
// calculates how many spaces we need after the version to have a correct formatting
|
|
22
|
-
const baseLength = `; ${label}: `.length + version.length;
|
|
23
|
-
const spaceCount = Math.max(0, 30 - baseLength);
|
|
24
|
-
const spaces = ' '.repeat(spaceCount);
|
|
25
|
-
|
|
26
|
-
return `; ${label}: ${version}${spaces};`;
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
async function run() {
|
|
30
|
-
//check if postinstall.json exists (exists -> update, doesnt -> new install)
|
|
31
|
-
if (fs.existsSync(postinstallJsonPath)) {
|
|
32
|
-
try {
|
|
33
|
-
const postinstallData = JSON.parse(fs.readFileSync(postinstallJsonPath, 'utf8'));
|
|
34
|
-
currentVersion = postinstallData.version || '';
|
|
35
|
-
isUpgrade = true;
|
|
36
|
-
|
|
37
|
-
let newVersion = '';
|
|
38
|
-
try {
|
|
39
|
-
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
|
|
40
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
41
|
-
newVersion = packageJson.version || '';
|
|
42
|
-
} catch (err) {
|
|
43
|
-
logger.error(`Error reading package.json for display`, err.message);
|
|
44
|
-
newVersion = 'unknown';
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
logger.info(';=============================;');
|
|
48
|
-
logger.info('; u2a has been updated! ;');
|
|
49
|
-
logger.info('; Successfully migrated from ;');
|
|
50
|
-
logger.info(formatVersionLine('Old version', currentVersion));
|
|
51
|
-
logger.info(formatVersionLine('New version', newVersion));
|
|
52
|
-
logger.info(';=============================;');
|
|
53
|
-
|
|
54
|
-
initSettings();
|
|
55
|
-
upgrade();
|
|
56
|
-
} catch (err) {
|
|
57
|
-
logger.error(`Error reading postinstall.json`, err.message);
|
|
58
|
-
isUpgrade = false;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const sendAnonReports = getSetting('send_anon_reports');
|
|
63
|
-
|
|
64
|
-
// shows this cool message if it isnt an upgrade
|
|
65
|
-
if (!isUpgrade) {
|
|
66
|
-
logger.info(';=============================;');
|
|
67
|
-
logger.info('; Welcome to u2a ! ;');
|
|
68
|
-
logger.info('; Thanks for downloading this ;');
|
|
69
|
-
logger.info('; tool ! ;');
|
|
70
|
-
logger.info('; ;');
|
|
71
|
-
logger.info('; Create a local webapp with ;');
|
|
72
|
-
logger.info('; \'u2a create <url/domain>\' ;');
|
|
73
|
-
logger.info('; ;');
|
|
74
|
-
logger.info('; Check docs.urltoapp.xyz for ;');
|
|
75
|
-
logger.info('; more detailed usage. ;');
|
|
76
|
-
logger.info('; ;');
|
|
77
|
-
logger.info('; Note: Anonymous installs ;');
|
|
78
|
-
logger.info('; reports are enabled by ;');
|
|
79
|
-
logger.info('; default. To disable: ;');
|
|
80
|
-
logger.info('; \'u2a configure reports ;');
|
|
81
|
-
logger.info('; disable\' ;');
|
|
82
|
-
logger.info(';=============================;');
|
|
83
|
-
|
|
84
|
-
initSettings(true);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
|
|
89
|
-
let newVersion = '';
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
93
|
-
newVersion = packageJson.version || '';
|
|
94
|
-
} catch (err) {
|
|
95
|
-
logger.error(`Error reading package.json`, err.message);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (sendAnonReports) {
|
|
99
|
-
try {
|
|
100
|
-
|
|
101
|
-
const params = new URLSearchParams({
|
|
102
|
-
previousVersion: currentVersion,
|
|
103
|
-
newVersion: newVersion
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
// backend here https://github.com/url2app/urltoapp.xyz/blob/main/api/v1/api/reports.php
|
|
107
|
-
await axios.get(`https://urltoapp.xyz/api/v1/reports?${params.toString()}`);
|
|
108
|
-
logger.debug('Anonymous usage report sent');
|
|
109
|
-
} catch (err) {
|
|
110
|
-
logger.debug(`Failed to send anonymous report: ${err.message}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
try {
|
|
115
|
-
fs.writeFileSync(postinstallJsonPath, JSON.stringify({
|
|
116
|
-
version: newVersion,
|
|
117
|
-
installed_at: new Date().toISOString()
|
|
118
|
-
}, null, 2));
|
|
119
|
-
} catch (err) {
|
|
120
|
-
logger.error(`Error updating postinstall.json`, err.message);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (isUpgrade) {
|
|
124
|
-
try {
|
|
125
|
-
logger.info('Checking for local apps that need upgrading...');
|
|
126
|
-
const upgradeStats = await upgrade(currentVersion, newVersion);
|
|
127
|
-
|
|
128
|
-
if (upgradeStats.skipped) {
|
|
129
|
-
if (upgradeStats.reason === 'disabled') {
|
|
130
|
-
logger.warn('Automatic upgrade for local apps is disabled in settings, skipped.');
|
|
131
|
-
} else if (upgradeStats.reason === 'not-core-update') {
|
|
132
|
-
logger.warn('This is not a core update, skipping local apps upgrade');
|
|
133
|
-
} else if (upgradeStats.reason === 'new-install') {
|
|
134
|
-
logger.warn('New installation, no local apps to upgrade');
|
|
135
|
-
}
|
|
136
|
-
} else {
|
|
137
|
-
logger.warn(`Local apps upgrade results: ${upgradeStats.upgraded} upgraded, ${upgradeStats.failed} failed`);
|
|
138
|
-
|
|
139
|
-
if (upgradeStats.upgraded > 0) {
|
|
140
|
-
logger.info(';=============================;');
|
|
141
|
-
logger.info('; Local apps have been updated;');
|
|
142
|
-
logger.info(formatVersionLine("Updated", upgradeStats.upgraded.toString())); //not a version but who cares anyway
|
|
143
|
-
if (upgradeStats.failed > 0) {
|
|
144
|
-
logger.info(formatVersionLine("Skipped", upgradeStats.failed.toString()));
|
|
145
|
-
}
|
|
146
|
-
logger.info(';=============================;');
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
} catch (err) {
|
|
150
|
-
logger.error('Error while upgrading local apps:', err.message);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
run().catch(err => {
|
|
156
|
-
logger.error(`Unexpected error`, err.message);
|
|
1
|
+
// Todo: autoupgrade for installed localapps, will be useful if we change file structure
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const axios = require('axios');
|
|
7
|
+
const Logger = require('./logger');
|
|
8
|
+
const { setupConfig, CONFIG_DIR } = require('./config');
|
|
9
|
+
const { initSettings, getSetting } = require('./settings');
|
|
10
|
+
const { upgrade } = require('./upgradeLA');
|
|
11
|
+
|
|
12
|
+
setupConfig(); // builds ~/.u2a/*
|
|
13
|
+
|
|
14
|
+
const logger = new Logger('postinstall');
|
|
15
|
+
const postinstallJsonPath = path.join(CONFIG_DIR, 'postinstall.json');
|
|
16
|
+
let isUpgrade = false;
|
|
17
|
+
let currentVersion = '0.0.0'; //0.0.0 for new installations
|
|
18
|
+
let sendAnonReports = true; // u2a configure reports disable to disable
|
|
19
|
+
|
|
20
|
+
const formatVersionLine = (label, version) => {
|
|
21
|
+
// calculates how many spaces we need after the version to have a correct formatting
|
|
22
|
+
const baseLength = `; ${label}: `.length + version.length;
|
|
23
|
+
const spaceCount = Math.max(0, 30 - baseLength);
|
|
24
|
+
const spaces = ' '.repeat(spaceCount);
|
|
25
|
+
|
|
26
|
+
return `; ${label}: ${version}${spaces};`;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
async function run() {
|
|
30
|
+
//check if postinstall.json exists (exists -> update, doesnt -> new install)
|
|
31
|
+
if (fs.existsSync(postinstallJsonPath)) {
|
|
32
|
+
try {
|
|
33
|
+
const postinstallData = JSON.parse(fs.readFileSync(postinstallJsonPath, 'utf8'));
|
|
34
|
+
currentVersion = postinstallData.version || '';
|
|
35
|
+
isUpgrade = true;
|
|
36
|
+
|
|
37
|
+
let newVersion = '';
|
|
38
|
+
try {
|
|
39
|
+
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
|
|
40
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
41
|
+
newVersion = packageJson.version || '';
|
|
42
|
+
} catch (err) {
|
|
43
|
+
logger.error(`Error reading package.json for display`, err.message);
|
|
44
|
+
newVersion = 'unknown';
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
logger.info(';=============================;');
|
|
48
|
+
logger.info('; u2a has been updated! ;');
|
|
49
|
+
logger.info('; Successfully migrated from ;');
|
|
50
|
+
logger.info(formatVersionLine('Old version', currentVersion));
|
|
51
|
+
logger.info(formatVersionLine('New version', newVersion));
|
|
52
|
+
logger.info(';=============================;');
|
|
53
|
+
|
|
54
|
+
initSettings();
|
|
55
|
+
upgrade();
|
|
56
|
+
} catch (err) {
|
|
57
|
+
logger.error(`Error reading postinstall.json`, err.message);
|
|
58
|
+
isUpgrade = false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const sendAnonReports = getSetting('send_anon_reports');
|
|
63
|
+
|
|
64
|
+
// shows this cool message if it isnt an upgrade
|
|
65
|
+
if (!isUpgrade) {
|
|
66
|
+
logger.info(';=============================;');
|
|
67
|
+
logger.info('; Welcome to u2a ! ;');
|
|
68
|
+
logger.info('; Thanks for downloading this ;');
|
|
69
|
+
logger.info('; tool ! ;');
|
|
70
|
+
logger.info('; ;');
|
|
71
|
+
logger.info('; Create a local webapp with ;');
|
|
72
|
+
logger.info('; \'u2a create <url/domain>\' ;');
|
|
73
|
+
logger.info('; ;');
|
|
74
|
+
logger.info('; Check docs.urltoapp.xyz for ;');
|
|
75
|
+
logger.info('; more detailed usage. ;');
|
|
76
|
+
logger.info('; ;');
|
|
77
|
+
logger.info('; Note: Anonymous installs ;');
|
|
78
|
+
logger.info('; reports are enabled by ;');
|
|
79
|
+
logger.info('; default. To disable: ;');
|
|
80
|
+
logger.info('; \'u2a configure reports ;');
|
|
81
|
+
logger.info('; disable\' ;');
|
|
82
|
+
logger.info(';=============================;');
|
|
83
|
+
|
|
84
|
+
initSettings(true);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
|
|
89
|
+
let newVersion = '';
|
|
90
|
+
|
|
91
|
+
try {
|
|
92
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
93
|
+
newVersion = packageJson.version || '';
|
|
94
|
+
} catch (err) {
|
|
95
|
+
logger.error(`Error reading package.json`, err.message);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (sendAnonReports) {
|
|
99
|
+
try {
|
|
100
|
+
|
|
101
|
+
const params = new URLSearchParams({
|
|
102
|
+
previousVersion: currentVersion,
|
|
103
|
+
newVersion: newVersion
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// backend here https://github.com/url2app/urltoapp.xyz/blob/main/api/v1/api/reports.php
|
|
107
|
+
await axios.get(`https://urltoapp.xyz/api/v1/reports?${params.toString()}`);
|
|
108
|
+
logger.debug('Anonymous usage report sent');
|
|
109
|
+
} catch (err) {
|
|
110
|
+
logger.debug(`Failed to send anonymous report: ${err.message}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
fs.writeFileSync(postinstallJsonPath, JSON.stringify({
|
|
116
|
+
version: newVersion,
|
|
117
|
+
installed_at: new Date().toISOString()
|
|
118
|
+
}, null, 2));
|
|
119
|
+
} catch (err) {
|
|
120
|
+
logger.error(`Error updating postinstall.json`, err.message);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (isUpgrade) {
|
|
124
|
+
try {
|
|
125
|
+
logger.info('Checking for local apps that need upgrading...');
|
|
126
|
+
const upgradeStats = await upgrade(currentVersion, newVersion);
|
|
127
|
+
|
|
128
|
+
if (upgradeStats.skipped) {
|
|
129
|
+
if (upgradeStats.reason === 'disabled') {
|
|
130
|
+
logger.warn('Automatic upgrade for local apps is disabled in settings, skipped.');
|
|
131
|
+
} else if (upgradeStats.reason === 'not-core-update') {
|
|
132
|
+
logger.warn('This is not a core update, skipping local apps upgrade');
|
|
133
|
+
} else if (upgradeStats.reason === 'new-install') {
|
|
134
|
+
logger.warn('New installation, no local apps to upgrade');
|
|
135
|
+
}
|
|
136
|
+
} else {
|
|
137
|
+
logger.warn(`Local apps upgrade results: ${upgradeStats.upgraded} upgraded, ${upgradeStats.failed} failed`);
|
|
138
|
+
|
|
139
|
+
if (upgradeStats.upgraded > 0) {
|
|
140
|
+
logger.info(';=============================;');
|
|
141
|
+
logger.info('; Local apps have been updated;');
|
|
142
|
+
logger.info(formatVersionLine("Updated", upgradeStats.upgraded.toString())); //not a version but who cares anyway
|
|
143
|
+
if (upgradeStats.failed > 0) {
|
|
144
|
+
logger.info(formatVersionLine("Skipped", upgradeStats.failed.toString()));
|
|
145
|
+
}
|
|
146
|
+
logger.info(';=============================;');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
} catch (err) {
|
|
150
|
+
logger.error('Error while upgrading local apps:', err.message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
run().catch(err => {
|
|
156
|
+
logger.error(`Unexpected error`, err.message);
|
|
157
157
|
});
|
package/src/utils/sanitize.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
const Logger = require('./logger');
|
|
2
|
-
const logger = new Logger('sanitize');
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function sanitizeInput(userInput) {
|
|
6
|
-
const sInput = userInput.replace(/[^a-zA-Z0-9_\-.\s:/@%]/g, '_');
|
|
7
|
-
logger.debug(`Original content: ${userInput} | Sanitized content: ${sInput}`);
|
|
8
|
-
return sInput;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function sanitizeCommand(command) {
|
|
12
|
-
const sCommand = command.replace(/[^\w\-.:/@\\ ="']/g, '_');
|
|
13
|
-
logger.debug(`Original content: ${command} | Sanitized content: ${sCommand}`);
|
|
14
|
-
return sCommand;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
module.exports = {
|
|
19
|
-
sanitizeInput,
|
|
20
|
-
sanitizeCommand
|
|
1
|
+
const Logger = require('./logger');
|
|
2
|
+
const logger = new Logger('sanitize');
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
function sanitizeInput(userInput) {
|
|
6
|
+
const sInput = userInput.replace(/[^a-zA-Z0-9_\-.\s:/@%]/g, '_');
|
|
7
|
+
logger.debug(`Original content: ${userInput} | Sanitized content: ${sInput}`);
|
|
8
|
+
return sInput;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function sanitizeCommand(command) {
|
|
12
|
+
const sCommand = command.replace(/[^\w\-.:/@\\ ="']/g, '_');
|
|
13
|
+
logger.debug(`Original content: ${command} | Sanitized content: ${sCommand}`);
|
|
14
|
+
return sCommand;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
module.exports = {
|
|
19
|
+
sanitizeInput,
|
|
20
|
+
sanitizeCommand
|
|
21
21
|
}
|
package/src/utils/securexec.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
const { execSync } = require('child_process');
|
|
2
|
-
const { sanitizeCommand } = require('./sanitize');
|
|
3
|
-
|
|
4
|
-
function secureExec(command, options = {}) {
|
|
5
|
-
const sanitizedCommand = sanitizeCommand(command);
|
|
6
|
-
const result = execSync(sanitizedCommand, options);
|
|
7
|
-
|
|
8
|
-
return result;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
module.exports = {
|
|
12
|
-
secureExec
|
|
1
|
+
const { execSync } = require('child_process');
|
|
2
|
+
const { sanitizeCommand } = require('./sanitize');
|
|
3
|
+
|
|
4
|
+
function secureExec(command, options = {}) {
|
|
5
|
+
const sanitizedCommand = sanitizeCommand(command);
|
|
6
|
+
const result = execSync(sanitizedCommand, options);
|
|
7
|
+
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
secureExec
|
|
13
13
|
}
|
package/src/utils/settings.js
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const { SETTINGS_PATH } = require('./config');
|
|
3
|
-
const Logger = require('./logger');
|
|
4
|
-
|
|
5
|
-
const logger = new Logger('settings');
|
|
6
|
-
|
|
7
|
-
const DEFAULT_SETTINGS = {
|
|
8
|
-
send_anon_reports: true,
|
|
9
|
-
version_check: true,
|
|
10
|
-
always_show_debug: false,
|
|
11
|
-
autoupgrade_localapps: false,
|
|
12
|
-
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
// reset is DANGEROUS ! resets all settings
|
|
16
|
-
function initSettings(reset = false) {
|
|
17
|
-
try {
|
|
18
|
-
let currentSettings = {};
|
|
19
|
-
|
|
20
|
-
if (!reset && fs.existsSync(SETTINGS_PATH)) {
|
|
21
|
-
try {
|
|
22
|
-
currentSettings = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
23
|
-
logger.debug('Existing settings loaded');
|
|
24
|
-
} catch (err) {
|
|
25
|
-
logger.debug(`Error reading existing settings.json, will
|
|
26
|
-
currentSettings = {};
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (reset) {
|
|
31
|
-
logger.debug('Resetting all settings to default values');
|
|
32
|
-
fs.writeFileSync(SETTINGS_PATH, JSON.stringify({ ...DEFAULT_SETTINGS }, null, 2));
|
|
33
|
-
return { ...DEFAULT_SETTINGS };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const mergedSettings = {};
|
|
37
|
-
|
|
38
|
-
Object.keys(DEFAULT_SETTINGS).forEach(key => {
|
|
39
|
-
mergedSettings[key] = currentSettings[key] !== undefined
|
|
40
|
-
? currentSettings[key]
|
|
41
|
-
: DEFAULT_SETTINGS[key];
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
Object.keys(currentSettings).forEach(key => {
|
|
45
|
-
if (mergedSettings[key] === undefined) {
|
|
46
|
-
mergedSettings[key] = currentSettings[key];
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(mergedSettings, null, 2));
|
|
51
|
-
logger.debug('Settings initialized successfully');
|
|
52
|
-
|
|
53
|
-
return mergedSettings;
|
|
54
|
-
} catch (err) {
|
|
55
|
-
logger.debug(`Error initializing settings.json`, err.message);
|
|
56
|
-
return { ...DEFAULT_SETTINGS };
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function getSettings() {
|
|
61
|
-
try {
|
|
62
|
-
if (fs.existsSync(SETTINGS_PATH)) {
|
|
63
|
-
return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
64
|
-
}
|
|
65
|
-
return {};
|
|
66
|
-
} catch (err) {
|
|
67
|
-
logger.debug(`Error reading settings.json`, err.message);
|
|
68
|
-
return {};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
function saveSettings(settings) {
|
|
74
|
-
try {
|
|
75
|
-
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));
|
|
76
|
-
logger.debug('Settings saved successfully');
|
|
77
|
-
} catch (err) {
|
|
78
|
-
logger.debug(`Error writing settings.json`, err.message);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
function getSetting(key, defaultValue = null) {
|
|
84
|
-
const settings = getSettings();
|
|
85
|
-
return settings[key] !== undefined ? settings[key] : defaultValue;
|
|
86
|
-
}
|
|
87
|
-
//use : setSetting('version_check', true);
|
|
88
|
-
function setSetting(key, value) {
|
|
89
|
-
const settings = getSettings();
|
|
90
|
-
settings[key] = value;
|
|
91
|
-
saveSettings(settings);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function resetSetting(key) {
|
|
95
|
-
if (!(key in DEFAULT_SETTINGS)) {
|
|
96
|
-
logger.debug(`resetSetting: "${key}" is not a valid default setting key`);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const settings = getSettings();
|
|
101
|
-
settings[key] = DEFAULT_SETTINGS[key];
|
|
102
|
-
saveSettings(settings);
|
|
103
|
-
logger.debug(`Setting "${key}" reset to default value`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
module.exports = {
|
|
108
|
-
DEFAULT_SETTINGS,
|
|
109
|
-
initSettings,
|
|
110
|
-
getSettings,
|
|
111
|
-
saveSettings,
|
|
112
|
-
getSetting,
|
|
113
|
-
setSetting,
|
|
114
|
-
resetSetting
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const { SETTINGS_PATH } = require('./config');
|
|
3
|
+
const Logger = require('./logger');
|
|
4
|
+
|
|
5
|
+
const logger = new Logger('settings');
|
|
6
|
+
|
|
7
|
+
const DEFAULT_SETTINGS = {
|
|
8
|
+
send_anon_reports: true,
|
|
9
|
+
version_check: true,
|
|
10
|
+
always_show_debug: false,
|
|
11
|
+
autoupgrade_localapps: false,
|
|
12
|
+
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
// reset is DANGEROUS ! resets all settings
|
|
16
|
+
function initSettings(reset = false) {
|
|
17
|
+
try {
|
|
18
|
+
let currentSettings = {};
|
|
19
|
+
|
|
20
|
+
if (!reset && fs.existsSync(SETTINGS_PATH)) {
|
|
21
|
+
try {
|
|
22
|
+
currentSettings = JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
23
|
+
logger.debug('Existing settings loaded');
|
|
24
|
+
} catch (err) {
|
|
25
|
+
logger.debug(`Error reading existing settings.json, will reset`, err.message);
|
|
26
|
+
currentSettings = {};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (reset) {
|
|
31
|
+
logger.debug('Resetting all settings to default values');
|
|
32
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify({ ...DEFAULT_SETTINGS }, null, 2));
|
|
33
|
+
return { ...DEFAULT_SETTINGS };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const mergedSettings = {};
|
|
37
|
+
|
|
38
|
+
Object.keys(DEFAULT_SETTINGS).forEach(key => {
|
|
39
|
+
mergedSettings[key] = currentSettings[key] !== undefined
|
|
40
|
+
? currentSettings[key]
|
|
41
|
+
: DEFAULT_SETTINGS[key];
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
Object.keys(currentSettings).forEach(key => {
|
|
45
|
+
if (mergedSettings[key] === undefined) {
|
|
46
|
+
mergedSettings[key] = currentSettings[key];
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(mergedSettings, null, 2));
|
|
51
|
+
logger.debug('Settings initialized successfully');
|
|
52
|
+
|
|
53
|
+
return mergedSettings;
|
|
54
|
+
} catch (err) {
|
|
55
|
+
logger.debug(`Error initializing settings.json`, err.message);
|
|
56
|
+
return { ...DEFAULT_SETTINGS };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function getSettings() {
|
|
61
|
+
try {
|
|
62
|
+
if (fs.existsSync(SETTINGS_PATH)) {
|
|
63
|
+
return JSON.parse(fs.readFileSync(SETTINGS_PATH, 'utf8'));
|
|
64
|
+
}
|
|
65
|
+
return {};
|
|
66
|
+
} catch (err) {
|
|
67
|
+
logger.debug(`Error reading settings.json`, err.message);
|
|
68
|
+
return {};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
function saveSettings(settings) {
|
|
74
|
+
try {
|
|
75
|
+
fs.writeFileSync(SETTINGS_PATH, JSON.stringify(settings, null, 2));
|
|
76
|
+
logger.debug('Settings saved successfully');
|
|
77
|
+
} catch (err) {
|
|
78
|
+
logger.debug(`Error writing settings.json`, err.message);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
function getSetting(key, defaultValue = null) {
|
|
84
|
+
const settings = getSettings();
|
|
85
|
+
return settings[key] !== undefined ? settings[key] : defaultValue;
|
|
86
|
+
}
|
|
87
|
+
//use : setSetting('version_check', true);
|
|
88
|
+
function setSetting(key, value) {
|
|
89
|
+
const settings = getSettings();
|
|
90
|
+
settings[key] = value;
|
|
91
|
+
saveSettings(settings);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function resetSetting(key) {
|
|
95
|
+
if (!(key in DEFAULT_SETTINGS)) {
|
|
96
|
+
logger.debug(`resetSetting: "${key}" is not a valid default setting key`);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const settings = getSettings();
|
|
101
|
+
settings[key] = DEFAULT_SETTINGS[key];
|
|
102
|
+
saveSettings(settings);
|
|
103
|
+
logger.debug(`Setting "${key}" reset to default value`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
module.exports = {
|
|
108
|
+
DEFAULT_SETTINGS,
|
|
109
|
+
initSettings,
|
|
110
|
+
getSettings,
|
|
111
|
+
saveSettings,
|
|
112
|
+
getSetting,
|
|
113
|
+
setSetting,
|
|
114
|
+
resetSetting
|
|
115
115
|
};
|