u
This commit is contained in:
@@ -5,16 +5,18 @@ import path from 'node:path';
|
||||
|
||||
import { CA_CERT, CERTS_DIR, HOST, SERVER_CERT, SERVER_KEY } from './config.mjs';
|
||||
|
||||
const SQL_CA_DIR = '/var/opt/mssql/security/ca-certificates';
|
||||
|
||||
export function certHosts(host) {
|
||||
const hosts = new Set([host, '127.0.0.1', 'localhost']);
|
||||
const hosts = new Set([host, '127.0.0.1', 'localhost', 's3backup.local']);
|
||||
for (const iface of Object.values(os.networkInterfaces())) {
|
||||
for (const addr of iface || []) {
|
||||
if (addr.family === 'IPv4' && !addr.internal) {
|
||||
if (addr.family === 'IPv4' && !addr.internal && !addr.address.startsWith('169.254.')) {
|
||||
hosts.add(addr.address);
|
||||
}
|
||||
}
|
||||
}
|
||||
return [...hosts];
|
||||
return [...hosts].sort();
|
||||
}
|
||||
|
||||
export function ensureCerts(host = HOST) {
|
||||
@@ -81,18 +83,99 @@ ${altNames}
|
||||
fs.writeFileSync(marker, hostList);
|
||||
}
|
||||
|
||||
export function caTrustStatus(container = process.env.MSSQL_DOCKER_CONTAINER || 'mssql') {
|
||||
if (!fs.existsSync(CA_CERT)) {
|
||||
return { ok: false, inSync: false, restarted: false };
|
||||
}
|
||||
const localFp = execSync(`openssl x509 -in "${CA_CERT}" -noout -fingerprint -sha256`, {
|
||||
encoding: 'utf8',
|
||||
}).trim();
|
||||
const remoteFp = spawnSync(
|
||||
'docker',
|
||||
[
|
||||
'exec',
|
||||
container,
|
||||
'bash',
|
||||
'-lc',
|
||||
`test -f ${SQL_CA_DIR}/jtlsrv-s3-ca.pem && openssl x509 -in ${SQL_CA_DIR}/jtlsrv-s3-ca.pem -noout -fingerprint -sha256`,
|
||||
],
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
const inSync = remoteFp.status === 0 && remoteFp.stdout.trim() === localFp;
|
||||
return { ok: remoteFp.status === 0, inSync, restarted: false };
|
||||
}
|
||||
|
||||
export function installCaTrust(container = process.env.MSSQL_DOCKER_CONTAINER || 'mssql') {
|
||||
if (!fs.existsSync(CA_CERT)) {
|
||||
ensureCerts();
|
||||
}
|
||||
|
||||
const copied = spawnSync('docker', ['cp', CA_CERT, `${container}:/tmp/jtlsrv-s3-ca.pem`], {
|
||||
const localFp = execSync(`openssl x509 -in "${CA_CERT}" -noout -fingerprint -sha256`, {
|
||||
encoding: 'utf8',
|
||||
}).trim();
|
||||
const remoteFp = spawnSync(
|
||||
'docker',
|
||||
[
|
||||
'exec',
|
||||
container,
|
||||
'bash',
|
||||
'-lc',
|
||||
`test -f ${SQL_CA_DIR}/jtlsrv-s3-ca.pem && openssl x509 -in ${SQL_CA_DIR}/jtlsrv-s3-ca.pem -noout -fingerprint -sha256`,
|
||||
],
|
||||
{ encoding: 'utf8' }
|
||||
);
|
||||
if (remoteFp.status === 0 && remoteFp.stdout.trim() === localFp) {
|
||||
spawnSync('docker', [
|
||||
'exec',
|
||||
'-u',
|
||||
'root',
|
||||
container,
|
||||
'bash',
|
||||
'-lc',
|
||||
'grep -q s3backup.local /etc/hosts || echo "172.17.0.1 s3backup.local" >> /etc/hosts',
|
||||
]);
|
||||
return { ok: true, restarted: false };
|
||||
}
|
||||
|
||||
spawnSync('docker', ['exec', '-u', 'root', container, 'mkdir', '-p', SQL_CA_DIR], {
|
||||
stdio: 'pipe',
|
||||
});
|
||||
if (copied.status !== 0) {
|
||||
return false;
|
||||
spawnSync('docker', [
|
||||
'exec',
|
||||
'-u',
|
||||
'root',
|
||||
container,
|
||||
'bash',
|
||||
'-lc',
|
||||
`rm -f ${SQL_CA_DIR}/*.pem ${SQL_CA_DIR}/*.crt`,
|
||||
]);
|
||||
spawnSync('docker', [
|
||||
'exec',
|
||||
'-u',
|
||||
'root',
|
||||
container,
|
||||
'bash',
|
||||
'-lc',
|
||||
'grep -q s3backup.local /etc/hosts || echo "172.17.0.1 s3backup.local" >> /etc/hosts',
|
||||
]);
|
||||
try {
|
||||
execSync('grep -q s3backup.local /etc/hosts || echo "172.17.0.1 s3backup.local" >> /etc/hosts', {
|
||||
stdio: 'pipe',
|
||||
});
|
||||
} catch {
|
||||
// optional on host
|
||||
}
|
||||
const installed = spawnSync(
|
||||
|
||||
const copied = spawnSync(
|
||||
'docker',
|
||||
['cp', CA_CERT, `${container}:${SQL_CA_DIR}/jtlsrv-s3-ca.pem`],
|
||||
{ stdio: 'pipe' }
|
||||
);
|
||||
if (copied.status !== 0) {
|
||||
return { ok: false, restarted: false };
|
||||
}
|
||||
|
||||
const perms = spawnSync(
|
||||
'docker',
|
||||
[
|
||||
'exec',
|
||||
@@ -101,9 +184,14 @@ export function installCaTrust(container = process.env.MSSQL_DOCKER_CONTAINER ||
|
||||
container,
|
||||
'bash',
|
||||
'-lc',
|
||||
'cp /tmp/jtlsrv-s3-ca.pem /usr/local/share/ca-certificates/jtlsrv-s3.crt && update-ca-certificates',
|
||||
`chown mssql:mssql ${SQL_CA_DIR}/jtlsrv-s3-ca.pem && chmod 644 ${SQL_CA_DIR}/jtlsrv-s3-ca.pem`,
|
||||
],
|
||||
{ stdio: 'pipe' }
|
||||
);
|
||||
return installed.status === 0;
|
||||
if (perms.status !== 0) {
|
||||
return { ok: false, restarted: false };
|
||||
}
|
||||
|
||||
const restarted = spawnSync('docker', ['restart', container], { stdio: 'pipe' });
|
||||
return { ok: true, restarted: restarted.status === 0 };
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user