@cocreate/cli 1.28.3 → 1.29.0
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/FUNDING.yml +3 -3
- package/.github/workflows/automated.yml +55 -55
- package/CHANGELOG.md +20 -0
- package/CONTRIBUTING.md +96 -96
- package/CoCreate.config.js +26 -26
- package/LICENSE +21 -21
- package/README.md +76 -76
- package/docs/index.html +242 -67
- package/package.json +3 -3
- package/release.config.js +21 -21
- package/repositories.js +475 -475
- package/src/addMeta.js +74 -74
- package/src/coc.js +80 -80
- package/src/commands/bump.js +85 -85
- package/src/commands/clone.js +2 -2
- package/src/commands/fs/automated.js +141 -141
- package/src/commands/fs/bump.js +74 -74
- package/src/commands/fs/config.js +78 -78
- package/src/commands/fs/contribution.js +136 -136
- package/src/commands/fs/gitignore.js +40 -40
- package/src/commands/fs/icon-extract.js +31 -31
- package/src/commands/fs/manual.js +91 -91
- package/src/commands/fs/package.js +39 -39
- package/src/commands/fs/readme.js +138 -138
- package/src/commands/fs/remove.js +28 -28
- package/src/commands/fs/replace.js +42 -42
- package/src/commands/fs/webpack.js +191 -191
- package/src/commands/git/gitConfig.js +70 -70
- package/src/commands/gitConfig.js +72 -72
- package/src/commands/install.js +24 -24
- package/src/commands/link.js +107 -107
- package/src/commands/nginx.js +25 -25
- package/src/commands/other/add.js +63 -63
- package/src/commands/other/config.sh +4 -4
- package/src/commands/other/nginxConfigManager.js +137 -137
- package/src/commands/other/nodeCertManager.js +147 -147
- package/src/commands/other/symlinkPwa.js +38 -38
- package/src/commands/other/test.js +43 -43
- package/src/commands/other/updateModules.js +50 -50
- package/src/commands/symlink.js +113 -111
- package/src/execute.js +66 -66
- package/src/spawn.js +9 -9
- package/webpack.config.js +84 -84
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
const util = require('node:util');
|
|
2
|
-
const exec = util.promisify(require('node:child_process').exec);
|
|
3
|
-
let fs = require('fs');
|
|
4
|
-
|
|
5
|
-
const available = "/etc/nginx/sites-available/"
|
|
6
|
-
const enabled = "/etc/nginx/sites-enabled/"
|
|
7
|
-
|
|
8
|
-
async function createServer(hosts) {
|
|
9
|
-
const response = {}
|
|
10
|
-
if (!Array.isArray(hosts))
|
|
11
|
-
hosts = [hosts]
|
|
12
|
-
|
|
13
|
-
for (let host of hosts) {
|
|
14
|
-
const hostParts = host.split('.')
|
|
15
|
-
const domain = hostParts[0];
|
|
16
|
-
const tld = hostParts[1];
|
|
17
|
-
const server = `
|
|
18
|
-
server {
|
|
19
|
-
server_name ~^(?<sub>.+)\.${domain}\.${tld} ${host};
|
|
20
|
-
|
|
21
|
-
location / {
|
|
22
|
-
proxy_pass http://localhost:3000;
|
|
23
|
-
proxy_set_header Host $host;
|
|
24
|
-
proxy_set_header X-Real-IP $remote_addr;
|
|
25
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
26
|
-
proxy_set_header X-Forwarded-Proto $scheme;
|
|
27
|
-
fastcgi_buffers 16 16k;
|
|
28
|
-
fastcgi_buffer_size 32k;
|
|
29
|
-
proxy_buffer_size 128k;
|
|
30
|
-
proxy_buffers 4 256k;
|
|
31
|
-
proxy_busy_buffers_size 256k;
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
location /ws/ {
|
|
36
|
-
proxy_pass http://localhost:3000;
|
|
37
|
-
proxy_set_header Host $host;
|
|
38
|
-
proxy_set_header X-Real-IP $remote_addr;
|
|
39
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
40
|
-
proxy_set_header X-Forwarded-Proto $scheme;
|
|
41
|
-
proxy_set_header Upgrade $http_upgrade;
|
|
42
|
-
proxy_set_header Connection "Upgrade";
|
|
43
|
-
fastcgi_buffers 16 16k;
|
|
44
|
-
fastcgi_buffer_size 32k;
|
|
45
|
-
proxy_buffer_size 128k;
|
|
46
|
-
proxy_buffers 4 256k;
|
|
47
|
-
proxy_busy_buffers_size 256k;
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
location /api/ {
|
|
52
|
-
proxy_pass http://localhost:3002;
|
|
53
|
-
proxy_set_header Host $host;
|
|
54
|
-
proxy_set_header X-Real-IP $remote_addr;
|
|
55
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
56
|
-
proxy_set_header X-Forwarded-Proto $scheme;
|
|
57
|
-
proxy_set_header Upgrade $http_upgrade;
|
|
58
|
-
proxy_set_header Connection "Upgrade";
|
|
59
|
-
fastcgi_buffers 16 16k;
|
|
60
|
-
fastcgi_buffer_size 32k;
|
|
61
|
-
proxy_buffer_size 128k;
|
|
62
|
-
proxy_buffers 4 256k;
|
|
63
|
-
proxy_busy_buffers_size 256k;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
listen 443 ssl http2;
|
|
67
|
-
ssl_certificate /etc/letsencrypt/live/${host}/fullchain.pem;
|
|
68
|
-
ssl_certificate_key /etc/letsencrypt/live/${host}/privkey.pem;
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
`;
|
|
73
|
-
fs.writeFileSync(`${available}${host}`, server)
|
|
74
|
-
|
|
75
|
-
if (!fs.existsSync(`${enabled}${host}`))
|
|
76
|
-
await exec(`sudo ln -s ${available}${host} ${enabled}`);
|
|
77
|
-
|
|
78
|
-
let test = await exec(`sudo nginx -t`);
|
|
79
|
-
if (test.stderr.includes('test is successful')) {
|
|
80
|
-
await exec(`sudo systemctl reload nginx`);
|
|
81
|
-
console.log(host, 'test passed reloading nginx')
|
|
82
|
-
response[host] = true
|
|
83
|
-
} else {
|
|
84
|
-
console.log(host, 'test failed')
|
|
85
|
-
response[host] = false
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (!fs.existsSync(`${enabled}main`)) {
|
|
91
|
-
let main = `server {
|
|
92
|
-
listen 80 default_server;
|
|
93
|
-
listen [::]:80 default_server;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
server_name _;
|
|
97
|
-
return 301 https://$host$request_uri;
|
|
98
|
-
}`
|
|
99
|
-
|
|
100
|
-
fs.writeFileSync(`${available}main`, main)
|
|
101
|
-
await exec(`sudo ln -s ${available}main ${enabled}`);
|
|
102
|
-
|
|
103
|
-
if (fs.existsSync(`${enabled}default`))
|
|
104
|
-
fs.unlinkSync(`${enabled}default`)
|
|
105
|
-
if (fs.existsSync(`${available}default`))
|
|
106
|
-
fs.unlinkSync(`${available}default`)
|
|
107
|
-
|
|
108
|
-
let test = await exec(`sudo nginx -t`);
|
|
109
|
-
if (test.stderr.includes('test is successful')) {
|
|
110
|
-
await exec(`sudo systemctl reload nginx`);
|
|
111
|
-
console.log('main test passed reloading nginx')
|
|
112
|
-
response['main'] = true
|
|
113
|
-
} else {
|
|
114
|
-
console.log('main test failed')
|
|
115
|
-
response['main'] = false
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return response
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async function deleteServer(hosts) {
|
|
124
|
-
const response = {}
|
|
125
|
-
if (!Array.isArray(hosts))
|
|
126
|
-
hosts = [hosts]
|
|
127
|
-
for (let host of hosts) {
|
|
128
|
-
if (fs.existsSync(`${enabled}${host}`))
|
|
129
|
-
fs.unlinkSync(`${enabled}${host}`)
|
|
130
|
-
if (fs.existsSync(`${available}${host}`))
|
|
131
|
-
fs.unlinkSync(`${available}${host}`)
|
|
132
|
-
|
|
133
|
-
response[host] = true
|
|
134
|
-
}
|
|
135
|
-
return response
|
|
136
|
-
}
|
|
137
|
-
|
|
1
|
+
const util = require('node:util');
|
|
2
|
+
const exec = util.promisify(require('node:child_process').exec);
|
|
3
|
+
let fs = require('fs');
|
|
4
|
+
|
|
5
|
+
const available = "/etc/nginx/sites-available/"
|
|
6
|
+
const enabled = "/etc/nginx/sites-enabled/"
|
|
7
|
+
|
|
8
|
+
async function createServer(hosts) {
|
|
9
|
+
const response = {}
|
|
10
|
+
if (!Array.isArray(hosts))
|
|
11
|
+
hosts = [hosts]
|
|
12
|
+
|
|
13
|
+
for (let host of hosts) {
|
|
14
|
+
const hostParts = host.split('.')
|
|
15
|
+
const domain = hostParts[0];
|
|
16
|
+
const tld = hostParts[1];
|
|
17
|
+
const server = `
|
|
18
|
+
server {
|
|
19
|
+
server_name ~^(?<sub>.+)\.${domain}\.${tld} ${host};
|
|
20
|
+
|
|
21
|
+
location / {
|
|
22
|
+
proxy_pass http://localhost:3000;
|
|
23
|
+
proxy_set_header Host $host;
|
|
24
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
25
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
26
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
27
|
+
fastcgi_buffers 16 16k;
|
|
28
|
+
fastcgi_buffer_size 32k;
|
|
29
|
+
proxy_buffer_size 128k;
|
|
30
|
+
proxy_buffers 4 256k;
|
|
31
|
+
proxy_busy_buffers_size 256k;
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
location /ws/ {
|
|
36
|
+
proxy_pass http://localhost:3000;
|
|
37
|
+
proxy_set_header Host $host;
|
|
38
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
39
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
40
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
41
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
42
|
+
proxy_set_header Connection "Upgrade";
|
|
43
|
+
fastcgi_buffers 16 16k;
|
|
44
|
+
fastcgi_buffer_size 32k;
|
|
45
|
+
proxy_buffer_size 128k;
|
|
46
|
+
proxy_buffers 4 256k;
|
|
47
|
+
proxy_busy_buffers_size 256k;
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
location /api/ {
|
|
52
|
+
proxy_pass http://localhost:3002;
|
|
53
|
+
proxy_set_header Host $host;
|
|
54
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
55
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
56
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
57
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
58
|
+
proxy_set_header Connection "Upgrade";
|
|
59
|
+
fastcgi_buffers 16 16k;
|
|
60
|
+
fastcgi_buffer_size 32k;
|
|
61
|
+
proxy_buffer_size 128k;
|
|
62
|
+
proxy_buffers 4 256k;
|
|
63
|
+
proxy_busy_buffers_size 256k;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
listen 443 ssl http2;
|
|
67
|
+
ssl_certificate /etc/letsencrypt/live/${host}/fullchain.pem;
|
|
68
|
+
ssl_certificate_key /etc/letsencrypt/live/${host}/privkey.pem;
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
`;
|
|
73
|
+
fs.writeFileSync(`${available}${host}`, server)
|
|
74
|
+
|
|
75
|
+
if (!fs.existsSync(`${enabled}${host}`))
|
|
76
|
+
await exec(`sudo ln -s ${available}${host} ${enabled}`);
|
|
77
|
+
|
|
78
|
+
let test = await exec(`sudo nginx -t`);
|
|
79
|
+
if (test.stderr.includes('test is successful')) {
|
|
80
|
+
await exec(`sudo systemctl reload nginx`);
|
|
81
|
+
console.log(host, 'test passed reloading nginx')
|
|
82
|
+
response[host] = true
|
|
83
|
+
} else {
|
|
84
|
+
console.log(host, 'test failed')
|
|
85
|
+
response[host] = false
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
if (!fs.existsSync(`${enabled}main`)) {
|
|
91
|
+
let main = `server {
|
|
92
|
+
listen 80 default_server;
|
|
93
|
+
listen [::]:80 default_server;
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
server_name _;
|
|
97
|
+
return 301 https://$host$request_uri;
|
|
98
|
+
}`
|
|
99
|
+
|
|
100
|
+
fs.writeFileSync(`${available}main`, main)
|
|
101
|
+
await exec(`sudo ln -s ${available}main ${enabled}`);
|
|
102
|
+
|
|
103
|
+
if (fs.existsSync(`${enabled}default`))
|
|
104
|
+
fs.unlinkSync(`${enabled}default`)
|
|
105
|
+
if (fs.existsSync(`${available}default`))
|
|
106
|
+
fs.unlinkSync(`${available}default`)
|
|
107
|
+
|
|
108
|
+
let test = await exec(`sudo nginx -t`);
|
|
109
|
+
if (test.stderr.includes('test is successful')) {
|
|
110
|
+
await exec(`sudo systemctl reload nginx`);
|
|
111
|
+
console.log('main test passed reloading nginx')
|
|
112
|
+
response['main'] = true
|
|
113
|
+
} else {
|
|
114
|
+
console.log('main test failed')
|
|
115
|
+
response['main'] = false
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return response
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function deleteServer(hosts) {
|
|
124
|
+
const response = {}
|
|
125
|
+
if (!Array.isArray(hosts))
|
|
126
|
+
hosts = [hosts]
|
|
127
|
+
for (let host of hosts) {
|
|
128
|
+
if (fs.existsSync(`${enabled}${host}`))
|
|
129
|
+
fs.unlinkSync(`${enabled}${host}`)
|
|
130
|
+
if (fs.existsSync(`${available}${host}`))
|
|
131
|
+
fs.unlinkSync(`${available}${host}`)
|
|
132
|
+
|
|
133
|
+
response[host] = true
|
|
134
|
+
}
|
|
135
|
+
return response
|
|
136
|
+
}
|
|
137
|
+
|
|
138
138
|
module.exports = {createServer, deleteServer}
|
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
const util = require('node:util');
|
|
2
|
-
const exec = require('node:child_process').exec;
|
|
3
|
-
const dns = require('dns');
|
|
4
|
-
const child_process = require('child_process');
|
|
5
|
-
const spawn = child_process.spawn;
|
|
6
|
-
|
|
7
|
-
const localip = '3.231.17.247'
|
|
8
|
-
const certificates = new Map()
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
async function checkDns(host) {
|
|
12
|
-
return new Promise((resolve, reject) => {
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
dns.resolve(host, 'A', (err, records) => {
|
|
16
|
-
if (records && records[0] === localip) {
|
|
17
|
-
resolve(true)
|
|
18
|
-
} else {
|
|
19
|
-
console.log('host A record need to point to', localip)
|
|
20
|
-
resolve(false)
|
|
21
|
-
}
|
|
22
|
-
if (err)
|
|
23
|
-
console.log(host, err);
|
|
24
|
-
});
|
|
25
|
-
} catch(err) {
|
|
26
|
-
console.log('certificate', err)
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async function createCert(host) {
|
|
32
|
-
try {
|
|
33
|
-
// let hosts = await exec(`sudo openssl x509 -dates -noout -in /etc/letsencrypt/live/${host}/fullchain.pem`);
|
|
34
|
-
// console.log('hostst check', hosts)
|
|
35
|
-
let test = await checkDns(host)
|
|
36
|
-
console.log('checked dns from creatCert', test)
|
|
37
|
-
if (test) {
|
|
38
|
-
await exec(`sudo certbot certonly --manual -d *.${host} -d ${host} --agree-tos --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory`);
|
|
39
|
-
let exitCode = await spawn('sudo', ['certbot', 'certonly', '--manual', '-d', `*.${host}`, '-d', host, '--agree-tos', '--preferred-challenges', 'dns-01', '--server', 'https://acme-v02.api.letsencrypt.org/directory'], { stdio: 'inherit', cwd: process.cwd() })
|
|
40
|
-
if (exitCode !== 0) {
|
|
41
|
-
failed.push({ name: false, des: `creating directory failed` })
|
|
42
|
-
} else
|
|
43
|
-
console.log(true)
|
|
44
|
-
|
|
45
|
-
// return true
|
|
46
|
-
} else
|
|
47
|
-
return false
|
|
48
|
-
} catch(err) {
|
|
49
|
-
return false
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function deleteCert(host) {
|
|
54
|
-
try {
|
|
55
|
-
await exec(`sudo certbot delete --cert-name ${host}`);
|
|
56
|
-
return true
|
|
57
|
-
} catch(err) {
|
|
58
|
-
return false
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async function checkCert(host) {
|
|
63
|
-
try {
|
|
64
|
-
let hosts = await exec(`host ${host}`);
|
|
65
|
-
console.log('hostst check', hosts)
|
|
66
|
-
|
|
67
|
-
if (certificates.has(host))
|
|
68
|
-
return true
|
|
69
|
-
else {
|
|
70
|
-
let certs = await exec(`sudo openssl x509 -dates -noout -in /etc/letsencrypt/live/${host}/fullchain.pem`);
|
|
71
|
-
let cert = certs.stdout.split('\n')
|
|
72
|
-
let issued = Date.parse(cert[0].replace('notBefore=', ''))
|
|
73
|
-
let expires = Date.parse(cert[1].replace('notAfter=', ''))
|
|
74
|
-
let currentDate = new Date()
|
|
75
|
-
|
|
76
|
-
if (!issued || !expires)
|
|
77
|
-
console.log('not defined', {issued, expires})
|
|
78
|
-
else if (!isNaN(expires)) {
|
|
79
|
-
if (currentDate < expires) {
|
|
80
|
-
certificates.set(host, {issued, expires})
|
|
81
|
-
return true
|
|
82
|
-
} else {
|
|
83
|
-
let cert = await createCert(host)
|
|
84
|
-
return cert
|
|
85
|
-
}
|
|
86
|
-
} else {
|
|
87
|
-
let cert = await createCert(host)
|
|
88
|
-
return cert
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
} catch(err) {
|
|
92
|
-
let cert = await createCert(host)
|
|
93
|
-
if (cert)
|
|
94
|
-
certificates.set(host, {issued, expires})
|
|
95
|
-
return cert
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async function test(host) {
|
|
100
|
-
try {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
await exec(`sudo certbot certonly --manual --test-cert -d *.${host} -d ${host} --agree-tos --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory`);
|
|
104
|
-
let exitCode = await spawn('sudo', ['certbot', 'certonly', '--manual', '--test-cert', '-d', `*.${host}`, '-d', host, '--agree-tos', '--preferred-challenges', 'dns-01', '--server', 'https://acme-v02.api.letsencrypt.org/directory'], { stdio: 'inherit', cwd: process.cwd() })
|
|
105
|
-
if (exitCode !== 0) {
|
|
106
|
-
failed.push({ name: false, des: `creating directory failed` })
|
|
107
|
-
} else
|
|
108
|
-
console.log(true)
|
|
109
|
-
|
|
110
|
-
// let child = exec('su -')
|
|
111
|
-
// child.stdin.write("testserver\n");
|
|
112
|
-
|
|
113
|
-
// child.stdout.on('data', (data) => {
|
|
114
|
-
// console.log(`stdout: "${data}"`);
|
|
115
|
-
// });
|
|
116
|
-
|
|
117
|
-
// child.stdin.end(); // EOF
|
|
118
|
-
|
|
119
|
-
// child.on('close', (code) => {
|
|
120
|
-
// console.log(`Child process exited with code ${code}.`);
|
|
121
|
-
// });
|
|
122
|
-
|
|
123
|
-
// exitCode.on("data", data => {
|
|
124
|
-
// console.log('test')
|
|
125
|
-
// })
|
|
126
|
-
// let test = exitCode
|
|
127
|
-
// if (exitCode !== 0) {
|
|
128
|
-
// exitCode.write('test', (err) => {
|
|
129
|
-
// if (err) throw Error(err.message)
|
|
130
|
-
// })
|
|
131
|
-
// } else {
|
|
132
|
-
// exitCode.write('test', (err) => {
|
|
133
|
-
// if (err) throw Error(err.message)
|
|
134
|
-
// })
|
|
135
|
-
// }
|
|
136
|
-
|
|
137
|
-
// return true
|
|
138
|
-
// return false
|
|
139
|
-
} catch(err) {
|
|
140
|
-
process.exit(1)
|
|
141
|
-
// return false
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
test('cocreate.app')
|
|
147
|
-
|
|
1
|
+
const util = require('node:util');
|
|
2
|
+
const exec = require('node:child_process').exec;
|
|
3
|
+
const dns = require('dns');
|
|
4
|
+
const child_process = require('child_process');
|
|
5
|
+
const spawn = child_process.spawn;
|
|
6
|
+
|
|
7
|
+
const localip = '3.231.17.247'
|
|
8
|
+
const certificates = new Map()
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
async function checkDns(host) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
dns.resolve(host, 'A', (err, records) => {
|
|
16
|
+
if (records && records[0] === localip) {
|
|
17
|
+
resolve(true)
|
|
18
|
+
} else {
|
|
19
|
+
console.log('host A record need to point to', localip)
|
|
20
|
+
resolve(false)
|
|
21
|
+
}
|
|
22
|
+
if (err)
|
|
23
|
+
console.log(host, err);
|
|
24
|
+
});
|
|
25
|
+
} catch(err) {
|
|
26
|
+
console.log('certificate', err)
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function createCert(host) {
|
|
32
|
+
try {
|
|
33
|
+
// let hosts = await exec(`sudo openssl x509 -dates -noout -in /etc/letsencrypt/live/${host}/fullchain.pem`);
|
|
34
|
+
// console.log('hostst check', hosts)
|
|
35
|
+
let test = await checkDns(host)
|
|
36
|
+
console.log('checked dns from creatCert', test)
|
|
37
|
+
if (test) {
|
|
38
|
+
await exec(`sudo certbot certonly --manual -d *.${host} -d ${host} --agree-tos --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory`);
|
|
39
|
+
let exitCode = await spawn('sudo', ['certbot', 'certonly', '--manual', '-d', `*.${host}`, '-d', host, '--agree-tos', '--preferred-challenges', 'dns-01', '--server', 'https://acme-v02.api.letsencrypt.org/directory'], { stdio: 'inherit', cwd: process.cwd() })
|
|
40
|
+
if (exitCode !== 0) {
|
|
41
|
+
failed.push({ name: false, des: `creating directory failed` })
|
|
42
|
+
} else
|
|
43
|
+
console.log(true)
|
|
44
|
+
|
|
45
|
+
// return true
|
|
46
|
+
} else
|
|
47
|
+
return false
|
|
48
|
+
} catch(err) {
|
|
49
|
+
return false
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function deleteCert(host) {
|
|
54
|
+
try {
|
|
55
|
+
await exec(`sudo certbot delete --cert-name ${host}`);
|
|
56
|
+
return true
|
|
57
|
+
} catch(err) {
|
|
58
|
+
return false
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function checkCert(host) {
|
|
63
|
+
try {
|
|
64
|
+
let hosts = await exec(`host ${host}`);
|
|
65
|
+
console.log('hostst check', hosts)
|
|
66
|
+
|
|
67
|
+
if (certificates.has(host))
|
|
68
|
+
return true
|
|
69
|
+
else {
|
|
70
|
+
let certs = await exec(`sudo openssl x509 -dates -noout -in /etc/letsencrypt/live/${host}/fullchain.pem`);
|
|
71
|
+
let cert = certs.stdout.split('\n')
|
|
72
|
+
let issued = Date.parse(cert[0].replace('notBefore=', ''))
|
|
73
|
+
let expires = Date.parse(cert[1].replace('notAfter=', ''))
|
|
74
|
+
let currentDate = new Date()
|
|
75
|
+
|
|
76
|
+
if (!issued || !expires)
|
|
77
|
+
console.log('not defined', {issued, expires})
|
|
78
|
+
else if (!isNaN(expires)) {
|
|
79
|
+
if (currentDate < expires) {
|
|
80
|
+
certificates.set(host, {issued, expires})
|
|
81
|
+
return true
|
|
82
|
+
} else {
|
|
83
|
+
let cert = await createCert(host)
|
|
84
|
+
return cert
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
let cert = await createCert(host)
|
|
88
|
+
return cert
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
} catch(err) {
|
|
92
|
+
let cert = await createCert(host)
|
|
93
|
+
if (cert)
|
|
94
|
+
certificates.set(host, {issued, expires})
|
|
95
|
+
return cert
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function test(host) {
|
|
100
|
+
try {
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
await exec(`sudo certbot certonly --manual --test-cert -d *.${host} -d ${host} --agree-tos --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory`);
|
|
104
|
+
let exitCode = await spawn('sudo', ['certbot', 'certonly', '--manual', '--test-cert', '-d', `*.${host}`, '-d', host, '--agree-tos', '--preferred-challenges', 'dns-01', '--server', 'https://acme-v02.api.letsencrypt.org/directory'], { stdio: 'inherit', cwd: process.cwd() })
|
|
105
|
+
if (exitCode !== 0) {
|
|
106
|
+
failed.push({ name: false, des: `creating directory failed` })
|
|
107
|
+
} else
|
|
108
|
+
console.log(true)
|
|
109
|
+
|
|
110
|
+
// let child = exec('su -')
|
|
111
|
+
// child.stdin.write("testserver\n");
|
|
112
|
+
|
|
113
|
+
// child.stdout.on('data', (data) => {
|
|
114
|
+
// console.log(`stdout: "${data}"`);
|
|
115
|
+
// });
|
|
116
|
+
|
|
117
|
+
// child.stdin.end(); // EOF
|
|
118
|
+
|
|
119
|
+
// child.on('close', (code) => {
|
|
120
|
+
// console.log(`Child process exited with code ${code}.`);
|
|
121
|
+
// });
|
|
122
|
+
|
|
123
|
+
// exitCode.on("data", data => {
|
|
124
|
+
// console.log('test')
|
|
125
|
+
// })
|
|
126
|
+
// let test = exitCode
|
|
127
|
+
// if (exitCode !== 0) {
|
|
128
|
+
// exitCode.write('test', (err) => {
|
|
129
|
+
// if (err) throw Error(err.message)
|
|
130
|
+
// })
|
|
131
|
+
// } else {
|
|
132
|
+
// exitCode.write('test', (err) => {
|
|
133
|
+
// if (err) throw Error(err.message)
|
|
134
|
+
// })
|
|
135
|
+
// }
|
|
136
|
+
|
|
137
|
+
// return true
|
|
138
|
+
// return false
|
|
139
|
+
} catch(err) {
|
|
140
|
+
process.exit(1)
|
|
141
|
+
// return false
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
test('cocreate.app')
|
|
147
|
+
|
|
148
148
|
module.exports = {checkDns, checkCert, createCert, deleteCert}
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
const fs = require('fs')
|
|
2
|
-
const path = require('path')
|
|
3
|
-
|
|
4
|
-
function symlink(dir, dest, option) {
|
|
5
|
-
if (!fs.existsSync(dir)) {
|
|
6
|
-
return console.log(dir, 'does not exist')
|
|
7
|
-
} else
|
|
8
|
-
dir = path.resolve(dir)
|
|
9
|
-
|
|
10
|
-
if (fs.existsSync(dest))
|
|
11
|
-
fs.rm(dest, { recursive: true, force: true }, function (err) {
|
|
12
|
-
if (err) {
|
|
13
|
-
console.log('failed');
|
|
14
|
-
}
|
|
15
|
-
createSymlink(dir, dest, option)
|
|
16
|
-
});
|
|
17
|
-
else
|
|
18
|
-
createSymlink(dir, dest, option)
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function createSymlink(dir, dest, option) {
|
|
22
|
-
dest = path.resolve(dest)
|
|
23
|
-
|
|
24
|
-
fs.symlink(dir, dest, option, (err) => {
|
|
25
|
-
console.log(dir, dest, option)
|
|
26
|
-
if (err)
|
|
27
|
-
console.log(err);
|
|
28
|
-
else {
|
|
29
|
-
console.log("symlink added");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
symlink('./src/assets', '../assets', 'dir')
|
|
37
|
-
symlink('./src/manifest.webmanifest', '../manifest.webmanifest', 'file')
|
|
38
|
-
symlink('./src/sw.js', '../sw.js', 'file')
|
|
1
|
+
const fs = require('fs')
|
|
2
|
+
const path = require('path')
|
|
3
|
+
|
|
4
|
+
function symlink(dir, dest, option) {
|
|
5
|
+
if (!fs.existsSync(dir)) {
|
|
6
|
+
return console.log(dir, 'does not exist')
|
|
7
|
+
} else
|
|
8
|
+
dir = path.resolve(dir)
|
|
9
|
+
|
|
10
|
+
if (fs.existsSync(dest))
|
|
11
|
+
fs.rm(dest, { recursive: true, force: true }, function (err) {
|
|
12
|
+
if (err) {
|
|
13
|
+
console.log('failed');
|
|
14
|
+
}
|
|
15
|
+
createSymlink(dir, dest, option)
|
|
16
|
+
});
|
|
17
|
+
else
|
|
18
|
+
createSymlink(dir, dest, option)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function createSymlink(dir, dest, option) {
|
|
22
|
+
dest = path.resolve(dest)
|
|
23
|
+
|
|
24
|
+
fs.symlink(dir, dest, option, (err) => {
|
|
25
|
+
console.log(dir, dest, option)
|
|
26
|
+
if (err)
|
|
27
|
+
console.log(err);
|
|
28
|
+
else {
|
|
29
|
+
console.log("symlink added");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
symlink('./src/assets', '../assets', 'dir')
|
|
37
|
+
symlink('./src/manifest.webmanifest', '../manifest.webmanifest', 'file')
|
|
38
|
+
symlink('./src/sw.js', '../sw.js', 'file')
|
|
39
39
|
symlink('./src/offline.html', '../offline.html', 'file')
|