Update dump realm local script

This commit is contained in:
Joseph Garrone 2024-12-15 13:27:49 +01:00
parent d0f43b6318
commit 5b83bd8fa9

View File

@ -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}`));
})(); })();