@underpostnet/underpost 2.99.6 → 2.99.8
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/.github/workflows/ghpkg.ci.yml +10 -25
- package/.github/workflows/npmpkg.ci.yml +14 -2
- package/CHANGELOG.md +520 -0
- package/Dockerfile +15 -15
- package/README.md +9 -16
- package/bin/deploy.js +13 -3
- package/bin/file.js +4 -19
- package/cli.md +46 -28
- package/examples/static-page/ssr-components/CustomPage.js +1 -1
- package/jsdoc.json +26 -5
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +9 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +9 -2
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/dd-test-development/deployment.yaml +2 -2
- package/package.json +1 -2
- package/src/cli/baremetal.js +8 -322
- package/src/cli/cloud-init.js +2 -2
- package/src/cli/index.js +12 -1
- package/src/cli/repository.js +166 -13
- package/src/cli/run.js +16 -42
- package/src/cli/ssh.js +1 -1
- package/src/cli/system.js +332 -0
- package/src/db/DataBaseProvider.js +3 -3
- package/src/db/mariadb/MariaDB.js +5 -5
- package/src/db/mongo/MongooseDB.js +3 -3
- package/src/index.js +17 -5
- package/src/mailer/EmailRender.js +3 -3
- package/src/mailer/MailerProvider.js +4 -4
- package/src/runtime/express/Dockerfile +15 -15
- package/src/runtime/lampp/Dockerfile +15 -15
- package/src/server/backup.js +15 -4
- package/src/server/client-build-docs.js +28 -2
- package/src/server/conf.js +8 -24
- package/src/server/cron.js +48 -38
- package/src/server/dns.js +0 -8
- package/bin/cron.js +0 -47
- package/bin/db.js +0 -199
- package/bin/hwt.js +0 -49
- package/bin/util.js +0 -63
package/bin/db.js
DELETED
|
@@ -1,199 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
import { shellExec } from '../src/server/process.js';
|
|
3
|
-
import { loggerFactory } from '../src/server/logger.js';
|
|
4
|
-
import { MariaDB } from '../src/db/mariadb/MariaDB.js';
|
|
5
|
-
import { Lampp } from '../src/runtime/lampp/Lampp.js';
|
|
6
|
-
import { getCapVariableName, loadConf, splitFileFactory } from '../src/server/conf.js';
|
|
7
|
-
import { DataBaseProvider } from '../src/db/DataBaseProvider.js';
|
|
8
|
-
import { hashPassword } from '../src/server/auth.js';
|
|
9
|
-
|
|
10
|
-
const logger = loggerFactory(import.meta);
|
|
11
|
-
|
|
12
|
-
logger.info('argv', process.argv);
|
|
13
|
-
|
|
14
|
-
const [exe, dir, hostPath = '', operator, deployId, arg0, arg1, arg2] = process.argv;
|
|
15
|
-
const [host, _path = ''] = hostPath.split('/');
|
|
16
|
-
const path = `/${_path}`;
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
let cmd;
|
|
20
|
-
if (deployId) loadConf(deployId);
|
|
21
|
-
const confServer = JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'));
|
|
22
|
-
const { runtime, db, git, client, directory } = confServer[host][path];
|
|
23
|
-
const { provider, name, user, password = '', backupPath = '' } = db;
|
|
24
|
-
// logger.info('database', confServer[host][`/${path}`].db);
|
|
25
|
-
switch (provider) {
|
|
26
|
-
case 'mariadb':
|
|
27
|
-
// Login:
|
|
28
|
-
// mysql -u root -h localhost -p
|
|
29
|
-
|
|
30
|
-
// Get Users:
|
|
31
|
-
// SELECT user,authentication_string,plugin,host FROM mysql.user;
|
|
32
|
-
|
|
33
|
-
// Get DB User:
|
|
34
|
-
// SELECT User, Db, Host from mysql.db;
|
|
35
|
-
|
|
36
|
-
// Change password:
|
|
37
|
-
// ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'NEW_PASSWORD';
|
|
38
|
-
// ALTER USER 'root'@'localhost' IDENTIFIED BY 'NEW_PASSWORD';
|
|
39
|
-
// ALTER USER 'root'@'::1' IDENTIFIED BY 'NEW_PASSWORD';
|
|
40
|
-
|
|
41
|
-
// Get all user privileges:
|
|
42
|
-
// select * from information_schema.user_privileges;
|
|
43
|
-
|
|
44
|
-
// Expose public server:
|
|
45
|
-
// '/etc/mysql/my.cnf' Change lines:
|
|
46
|
-
// bind-address = 127.0.0.1 -> bind-address = 0.0.0.0
|
|
47
|
-
// skip-networking -> #skip-networking
|
|
48
|
-
|
|
49
|
-
// Create user:
|
|
50
|
-
// DROP USER 'username'@'%';
|
|
51
|
-
// CREATE USER 'username'@'%' IDENTIFIED BY 'password';
|
|
52
|
-
|
|
53
|
-
// Set DB user:
|
|
54
|
-
// FLUSH PRIVILEGES;
|
|
55
|
-
// ON databasename.*
|
|
56
|
-
// TO 'username'@'%'
|
|
57
|
-
// IDENTIFIED BY 'newpassword';
|
|
58
|
-
// FLUSH PRIVILEGES;
|
|
59
|
-
|
|
60
|
-
// Set admin:
|
|
61
|
-
// FLUSH PRIVILEGES;
|
|
62
|
-
// GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
|
|
63
|
-
// FLUSH PRIVILEGES;
|
|
64
|
-
|
|
65
|
-
switch (operator) {
|
|
66
|
-
case 'show-all':
|
|
67
|
-
await MariaDB.query({ user, password, query: `SHOW DATABASES` });
|
|
68
|
-
break;
|
|
69
|
-
case 'show':
|
|
70
|
-
await MariaDB.query({ user, password, query: `SHOW TABLES FROM ${name}` });
|
|
71
|
-
break;
|
|
72
|
-
case 'create':
|
|
73
|
-
await MariaDB.query({ user, password, query: `CREATE DATABASE ${name}` });
|
|
74
|
-
break;
|
|
75
|
-
case 'delete':
|
|
76
|
-
await MariaDB.query({ user, password, query: `DROP DATABASE IF EXISTS ${name}` });
|
|
77
|
-
break;
|
|
78
|
-
case 'select':
|
|
79
|
-
{
|
|
80
|
-
const pageSize = 10;
|
|
81
|
-
const pageNumber = 1;
|
|
82
|
-
await MariaDB.query({
|
|
83
|
-
user,
|
|
84
|
-
password,
|
|
85
|
-
query: `SELECT ${arg0} FROM ${name}.${arg1} LIMIT ${pageSize} OFFSET ${(pageNumber - 1) * pageSize}`,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
break;
|
|
89
|
-
case 'count': {
|
|
90
|
-
await MariaDB.query({
|
|
91
|
-
user,
|
|
92
|
-
password,
|
|
93
|
-
query: `SELECT COUNT(*) AS total FROM ${name}.${arg0}`,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
case 'export':
|
|
97
|
-
{
|
|
98
|
-
const cmdBackupPath = `${arg0 ? `${arg0}/${name}.sql` : backupPath}`;
|
|
99
|
-
|
|
100
|
-
cmd = `mysqldump -u ${user} -p${password} ${name} > ${cmdBackupPath}`;
|
|
101
|
-
shellExec(cmd);
|
|
102
|
-
await splitFileFactory(name, cmdBackupPath);
|
|
103
|
-
}
|
|
104
|
-
break;
|
|
105
|
-
case 'import':
|
|
106
|
-
break;
|
|
107
|
-
|
|
108
|
-
case 'init-lampp-service':
|
|
109
|
-
await Lampp.initService();
|
|
110
|
-
break;
|
|
111
|
-
case 'remote-client-access':
|
|
112
|
-
{
|
|
113
|
-
// https://docs.anaconda.com/miniconda/install/#quick-command-line-install
|
|
114
|
-
// https://mariadb.com/kb/en/configuring-mariadb-for-remote-client-access/
|
|
115
|
-
// conf: /opt/lampp/etc
|
|
116
|
-
// conf: /etc/mysql/my.cnf
|
|
117
|
-
// conf: /etc/mysql/mariadb.conf.d/50-server.cnf
|
|
118
|
-
// cli: /opt/lampp/bin/mysql
|
|
119
|
-
// cli: mysql -h 127.0.0.1
|
|
120
|
-
// select db: use db0;
|
|
121
|
-
}
|
|
122
|
-
break;
|
|
123
|
-
default:
|
|
124
|
-
break;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
break;
|
|
128
|
-
|
|
129
|
-
case 'mongoose':
|
|
130
|
-
// MongoDB App Services CLI
|
|
131
|
-
switch (operator) {
|
|
132
|
-
case 'update':
|
|
133
|
-
{
|
|
134
|
-
await DataBaseProvider.load({ apis: [arg0], host, path, db });
|
|
135
|
-
const models = DataBaseProvider.instance[`${host}${path}`].mongoose.models[getCapVariableName(arg0)];
|
|
136
|
-
|
|
137
|
-
const select = JSON.parse(arg1.replaceAll("'", `"`));
|
|
138
|
-
const update = JSON.parse(arg2.replaceAll("'", `"`));
|
|
139
|
-
|
|
140
|
-
console.log({ models, select, update });
|
|
141
|
-
|
|
142
|
-
switch (arg0) {
|
|
143
|
-
case 'user':
|
|
144
|
-
if (update.password) update.password = hashPassword(update.password);
|
|
145
|
-
|
|
146
|
-
default:
|
|
147
|
-
break;
|
|
148
|
-
}
|
|
149
|
-
let doc = await models.findOne(select);
|
|
150
|
-
if (doc) {
|
|
151
|
-
doc = await models.findByIdAndUpdate(doc._id, update, {
|
|
152
|
-
runValidators: true,
|
|
153
|
-
});
|
|
154
|
-
logger.info(`successfully updated doc`, doc._doc);
|
|
155
|
-
await DataBaseProvider.instance[`${host}${path}`].mongoose.close();
|
|
156
|
-
} else throw new Error(`no doc found`);
|
|
157
|
-
}
|
|
158
|
-
break;
|
|
159
|
-
case 'show-all':
|
|
160
|
-
// show dbs
|
|
161
|
-
break;
|
|
162
|
-
case 'show':
|
|
163
|
-
break;
|
|
164
|
-
case 'create':
|
|
165
|
-
break;
|
|
166
|
-
case 'delete':
|
|
167
|
-
{
|
|
168
|
-
await DataBaseProvider.load({ apis: [arg0], host, path, db });
|
|
169
|
-
const models = DataBaseProvider.instance[`${host}${path}`].mongoose.models[getCapVariableName(arg0)];
|
|
170
|
-
await models.collection.drop();
|
|
171
|
-
logger.info(`successfully drop collection`, arg0);
|
|
172
|
-
await DataBaseProvider.instance[`${host}${path}`].mongoose.close();
|
|
173
|
-
}
|
|
174
|
-
break;
|
|
175
|
-
case 'export':
|
|
176
|
-
// mongodump -d <database_name> -o <directory_backup>
|
|
177
|
-
shellExec(`mongodump -d ${name} -o ${arg0 ? arg0 : `./engine-private/mongodb-backup/`}`);
|
|
178
|
-
break;
|
|
179
|
-
case 'import':
|
|
180
|
-
// mongorestore -d <database_name> <directory_backup>
|
|
181
|
-
break;
|
|
182
|
-
case 'init-service':
|
|
183
|
-
break;
|
|
184
|
-
default:
|
|
185
|
-
break;
|
|
186
|
-
}
|
|
187
|
-
break;
|
|
188
|
-
|
|
189
|
-
default:
|
|
190
|
-
break;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// logger.info(`Run the following command`, cmd);
|
|
194
|
-
// await ncp.copy(cmd);
|
|
195
|
-
// await read({ prompt: 'Command copy to clipboard, press enter to continue.\n' });
|
|
196
|
-
// throw new Error(``);
|
|
197
|
-
} catch (error) {
|
|
198
|
-
logger.error(error, error.stack);
|
|
199
|
-
}
|
package/bin/hwt.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
|
|
3
|
-
import { loggerFactory } from '../src/server/logger.js';
|
|
4
|
-
|
|
5
|
-
const logger = loggerFactory(import.meta);
|
|
6
|
-
|
|
7
|
-
logger.info('argv', process.argv);
|
|
8
|
-
|
|
9
|
-
const [exe, dir, operator, templateId, publicPath] = process.argv;
|
|
10
|
-
|
|
11
|
-
// engine for 'html-website-templates'
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
switch (operator) {
|
|
15
|
-
case 'set-base':
|
|
16
|
-
{
|
|
17
|
-
switch (parseInt(templateId)) {
|
|
18
|
-
// Horizontal Scroll One Page Template Website
|
|
19
|
-
case 0:
|
|
20
|
-
{
|
|
21
|
-
fs.writeFile(
|
|
22
|
-
`${publicPath}/index.html`,
|
|
23
|
-
fs
|
|
24
|
-
.readFileSync(`${publicPath}/index.html`, 'utf8')
|
|
25
|
-
.replace(`<ul class="menu">`, `<ul class="menu hidden">`)
|
|
26
|
-
.replaceAll(`<section class="slide fade-6 kenBurns">`, `<section class="fade-6 kenBurns hidden">`)
|
|
27
|
-
.replace(`<section class="fade-6 kenBurns hidden">`, `<section class="slide fade-6 kenBurns">`)
|
|
28
|
-
.replaceAll(
|
|
29
|
-
`<nav class="panel bottom forceMobileView">`,
|
|
30
|
-
`<nav class="panel bottom forceMobileView hidden">`,
|
|
31
|
-
),
|
|
32
|
-
|
|
33
|
-
'utf8',
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
break;
|
|
37
|
-
|
|
38
|
-
default:
|
|
39
|
-
break;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
break;
|
|
43
|
-
|
|
44
|
-
default:
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
} catch (error) {
|
|
48
|
-
logger.error(error, error.stack);
|
|
49
|
-
}
|
package/bin/util.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
import * as dir from 'path';
|
|
3
|
-
|
|
4
|
-
import { loggerFactory } from '../src/server/logger.js';
|
|
5
|
-
import { pbcopy } from '../src/server/process.js';
|
|
6
|
-
import { buildKindPorts } from '../src/server/conf.js';
|
|
7
|
-
|
|
8
|
-
const logger = loggerFactory(import.meta);
|
|
9
|
-
|
|
10
|
-
logger.info('argv', process.argv);
|
|
11
|
-
|
|
12
|
-
const operator = process.argv[2];
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
// let cmd;
|
|
16
|
-
switch (operator) {
|
|
17
|
-
case 'log':
|
|
18
|
-
console.log(fs.readFileSync(process.argv[3], 'utf8'));
|
|
19
|
-
break;
|
|
20
|
-
|
|
21
|
-
case 'delete-empty-folder':
|
|
22
|
-
function cleanEmptyFoldersRecursively(folder) {
|
|
23
|
-
if (!fs.existsSync(folder)) {
|
|
24
|
-
logger.warn('Does not exist', folder);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const isDir = fs.statSync(folder).isDirectory();
|
|
28
|
-
if (!isDir) return;
|
|
29
|
-
|
|
30
|
-
let files = fs.readdirSync(folder);
|
|
31
|
-
if (files.length > 0) {
|
|
32
|
-
files.forEach(function (file) {
|
|
33
|
-
const fullPath = dir.join(folder, file);
|
|
34
|
-
cleanEmptyFoldersRecursively(fullPath);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
// re-evaluate files; after deleting subfolder
|
|
38
|
-
// we may have parent folder empty now
|
|
39
|
-
files = fs.readdirSync(folder);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (files.length === 0) {
|
|
43
|
-
console.log('removing: ', folder);
|
|
44
|
-
try {
|
|
45
|
-
fs.rmdirSync(folder);
|
|
46
|
-
} catch (error) {
|
|
47
|
-
logger.error(error);
|
|
48
|
-
}
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
cleanEmptyFoldersRecursively('./');
|
|
53
|
-
break;
|
|
54
|
-
|
|
55
|
-
case 'build-ports': {
|
|
56
|
-
pbcopy(buildKindPorts(process.argv[3], process.argv[4]));
|
|
57
|
-
}
|
|
58
|
-
default:
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
} catch (error) {
|
|
62
|
-
logger.error(error, error.stack);
|
|
63
|
-
}
|