Update dump realm local script
This commit is contained in:
parent
d0f43b6318
commit
5b83bd8fa9
@ -1,11 +1,13 @@
|
|||||||
import { CONTAINER_NAME } from "../src/bin/shared/constants";
|
import { CONTAINER_NAME } from "../src/bin/shared/constants";
|
||||||
import child_process from "child_process";
|
import child_process from "child_process";
|
||||||
import { SemVer } from "../src/bin/tools/SemVer";
|
import { SemVer } from "../src/bin/tools/SemVer";
|
||||||
import { join as pathJoin, relative as pathRelative } from "path";
|
import { dumpContainerConfig } from "../src/bin/start-keycloak/realmConfig/dumpContainerConfig";
|
||||||
|
import { cacheDirPath } from "./shared/cacheDirPath";
|
||||||
|
import { runPrettier } from "../src/bin/tools/runPrettier";
|
||||||
|
import { getThisCodebaseRootDirPath } from "../src/bin/tools/getThisCodebaseRootDirPath";
|
||||||
|
import { join as pathJoin } from "path";
|
||||||
|
import * as fs from "fs";
|
||||||
import chalk from "chalk";
|
import chalk from "chalk";
|
||||||
import { Deferred } from "evt/tools/Deferred";
|
|
||||||
import { assert, is } from "tsafe/assert";
|
|
||||||
import { run } from "./shared/run";
|
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
const keycloakMajorVersionNumber = SemVer.parse(
|
const keycloakMajorVersionNumber = SemVer.parse(
|
||||||
@ -16,103 +18,32 @@ import { run } from "./shared/run";
|
|||||||
.split(":")[1]
|
.split(":")[1]
|
||||||
).major;
|
).major;
|
||||||
|
|
||||||
{
|
const parsedRealmJson = await dumpContainerConfig({
|
||||||
// https://github.com/keycloak/keycloak/issues/33800
|
buildContext: {
|
||||||
const doesUseLockedH2Database = keycloakMajorVersionNumber >= 26;
|
cacheDirPath
|
||||||
|
},
|
||||||
|
keycloakMajorVersionNumber,
|
||||||
|
realmName: "myrealm"
|
||||||
|
});
|
||||||
|
|
||||||
if (doesUseLockedH2Database) {
|
let sourceCode = JSON.stringify(parsedRealmJson, null, 2);
|
||||||
child_process.execSync(
|
|
||||||
`docker exec ${CONTAINER_NAME} sh -c "cp -rp /opt/keycloak/data/h2 /tmp"`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const dCompleted = new Deferred<void>();
|
const filePath = pathJoin(
|
||||||
|
getThisCodebaseRootDirPath(),
|
||||||
const child = child_process.spawn(
|
"src",
|
||||||
"docker",
|
"bin",
|
||||||
[
|
"start-keycloak",
|
||||||
...["exec", CONTAINER_NAME],
|
"realmConfig",
|
||||||
...["/opt/keycloak/bin/kc.sh", "export"],
|
"defaultConfig",
|
||||||
...["--dir", "/tmp"],
|
`realm-kc-${keycloakMajorVersionNumber}.json`
|
||||||
...["--realm", "myrealm"],
|
|
||||||
...["--users", "realm_file"],
|
|
||||||
...(!doesUseLockedH2Database
|
|
||||||
? []
|
|
||||||
: [
|
|
||||||
...["--db", "dev-file"],
|
|
||||||
...[
|
|
||||||
"--db-url",
|
|
||||||
"'jdbc:h2:file:/tmp/h2/keycloakdb;NON_KEYWORDS=VALUE'"
|
|
||||||
]
|
|
||||||
])
|
|
||||||
],
|
|
||||||
{ shell: true }
|
|
||||||
);
|
|
||||||
|
|
||||||
let output = "";
|
|
||||||
|
|
||||||
const onExit = (code: number | null) => {
|
|
||||||
dCompleted.reject(new Error(`Exited with code ${code}`));
|
|
||||||
};
|
|
||||||
|
|
||||||
child.once("exit", onExit);
|
|
||||||
|
|
||||||
child.stdout.on("data", data => {
|
|
||||||
const outputStr = data.toString("utf8");
|
|
||||||
|
|
||||||
if (outputStr.includes("Export finished successfully")) {
|
|
||||||
child.removeListener("exit", onExit);
|
|
||||||
|
|
||||||
// NOTE: On older Keycloak versions the process keeps running after the export is done.
|
|
||||||
const timer = setTimeout(() => {
|
|
||||||
child.removeListener("exit", onExit2);
|
|
||||||
child.kill();
|
|
||||||
dCompleted.resolve();
|
|
||||||
}, 1500);
|
|
||||||
|
|
||||||
const onExit2 = () => {
|
|
||||||
clearTimeout(timer);
|
|
||||||
dCompleted.resolve();
|
|
||||||
};
|
|
||||||
|
|
||||||
child.once("exit", onExit2);
|
|
||||||
}
|
|
||||||
|
|
||||||
output += outputStr;
|
|
||||||
});
|
|
||||||
|
|
||||||
child.stderr.on("data", data => (output += chalk.red(data.toString("utf8"))));
|
|
||||||
|
|
||||||
try {
|
|
||||||
await dCompleted.pr;
|
|
||||||
} catch (error) {
|
|
||||||
assert(is<Error>(error));
|
|
||||||
|
|
||||||
console.log(chalk.red(error.message));
|
|
||||||
|
|
||||||
console.log(output);
|
|
||||||
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doesUseLockedH2Database) {
|
|
||||||
run(`docker exec ${CONTAINER_NAME} sh -c "rm -rf /tmp/h2"`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const targetFilePath = pathRelative(
|
|
||||||
process.cwd(),
|
|
||||||
pathJoin(
|
|
||||||
__dirname,
|
|
||||||
"..",
|
|
||||||
"src",
|
|
||||||
"bin",
|
|
||||||
"start-keycloak",
|
|
||||||
`myrealm-realm-${keycloakMajorVersionNumber}.json`
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
run(`docker cp ${CONTAINER_NAME}:/tmp/myrealm-realm.json ${targetFilePath}`);
|
sourceCode = await runPrettier({
|
||||||
|
sourceCode,
|
||||||
|
filePath
|
||||||
|
});
|
||||||
|
|
||||||
console.log(`${chalk.green(`✓ Exported realm to`)} ${chalk.bold(targetFilePath)}`);
|
fs.writeFileSync(filePath, Buffer.from(sourceCode, "utf8"));
|
||||||
|
|
||||||
|
console.log(chalk.green(`Realm config dumped to ${filePath}`));
|
||||||
})();
|
})();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user