From 5b83bd8fa92b964c57968f0a7595addf2d59a07b Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Sun, 15 Dec 2024 13:27:49 +0100 Subject: [PATCH] Update dump realm local script --- scripts/dump-keycloak-realm.ts | 127 ++++++++------------------------- 1 file changed, 29 insertions(+), 98 deletions(-) diff --git a/scripts/dump-keycloak-realm.ts b/scripts/dump-keycloak-realm.ts index adf4e20a..95b740b3 100644 --- a/scripts/dump-keycloak-realm.ts +++ b/scripts/dump-keycloak-realm.ts @@ -1,11 +1,13 @@ import { CONTAINER_NAME } from "../src/bin/shared/constants"; import child_process from "child_process"; 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 { Deferred } from "evt/tools/Deferred"; -import { assert, is } from "tsafe/assert"; -import { run } from "./shared/run"; (async () => { const keycloakMajorVersionNumber = SemVer.parse( @@ -16,103 +18,32 @@ import { run } from "./shared/run"; .split(":")[1] ).major; - { - // https://github.com/keycloak/keycloak/issues/33800 - const doesUseLockedH2Database = keycloakMajorVersionNumber >= 26; + const parsedRealmJson = await dumpContainerConfig({ + buildContext: { + cacheDirPath + }, + keycloakMajorVersionNumber, + realmName: "myrealm" + }); - if (doesUseLockedH2Database) { - child_process.execSync( - `docker exec ${CONTAINER_NAME} sh -c "cp -rp /opt/keycloak/data/h2 /tmp"` - ); - } + let sourceCode = JSON.stringify(parsedRealmJson, null, 2); - const dCompleted = new Deferred(); - - const child = child_process.spawn( - "docker", - [ - ...["exec", CONTAINER_NAME], - ...["/opt/keycloak/bin/kc.sh", "export"], - ...["--dir", "/tmp"], - ...["--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)); - - 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` - ) + const filePath = pathJoin( + getThisCodebaseRootDirPath(), + "src", + "bin", + "start-keycloak", + "realmConfig", + "defaultConfig", + `realm-kc-${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}`)); })();