summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/frontend/cd.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/pybind/mgr/dashboard/frontend/cd.js')
-rwxr-xr-xsrc/pybind/mgr/dashboard/frontend/cd.js166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/pybind/mgr/dashboard/frontend/cd.js b/src/pybind/mgr/dashboard/frontend/cd.js
new file mode 100755
index 000000000..34d0ce29f
--- /dev/null
+++ b/src/pybind/mgr/dashboard/frontend/cd.js
@@ -0,0 +1,166 @@
+/**
+ * Ceph Dashboard node script
+ * This file should be used to aggregate all external scripts we need.
+ * Multiple flags can be used in the same call.
+ *
+ * Available flags:
+ * --env: Generates angular environment files.
+ *
+ * --pre: Modifies 'angular.json' to enable the build of custom locales using
+ * angular --localize.
+ * Languages can be defined using the environment variable DASHBOARD_FRONTEND_LANGS,
+ * if no value is provided all languages will be build.
+ * Default language is always build, even if not provided.
+ * p.e.: 'DASHBOARD_FRONTEND_LANGS="pt" node cd --pre', will build EN and PT.
+ * For backward compatibility we accept both long and short version of
+ * languages, p.e.: 'pt' and 'pt-BR'
+ *
+ * --res: Restores 'angular.json' to its original and removes the backup file.
+ */
+
+const fs = require('fs');
+
+const filename = './angular.json';
+const backup = './angular.backup.json';
+
+if (process.argv.includes('--env')) {
+ envBuild();
+}
+
+if (process.argv.includes('--pre')) {
+ prepareLocales();
+}
+
+if (process.argv.includes('--res')) {
+ restoreLocales();
+}
+
+function prepareLocales() {
+ try {
+ fs.accessSync(backup, fs.constants.F_OK);
+ logger(`'${backup}' already exists, restoring it into '${filename}'}`);
+ fs.copyFileSync(backup, filename);
+ } catch (err) {
+ fs.copyFileSync(filename, backup);
+ logger(`'${filename}' was copied to '${backup}'`);
+ }
+
+ let langs = process.env.DASHBOARD_FRONTEND_LANGS || '';
+ if (langs == 'ALL') {
+ logger(`Preparing build of all languages.`);
+ return;
+ } else if (langs.length == 0) {
+ langs = [];
+ logger(`Preparing build of EN.`);
+ } else {
+ langs = langs.split(/[ ,]/);
+ logger(`Preparing build of EN and ${langs}.`);
+ }
+
+ let angular = require(filename);
+
+ let allLocales = angular['projects']['ceph-dashboard']['i18n']['locales'];
+ let locales = {};
+
+ langs.forEach((lang) => {
+ const short = lang.substring(0, 2);
+ locale = allLocales[short];
+ if (locale) {
+ locales[short] = locale;
+ } else {
+ switch (lang) {
+ case 'zh-Hans':
+ case 'zh-CN':
+ locales['zh-Hans'] = allLocales['zh-Hans'];
+ break;
+
+ case 'zh-TW':
+ case 'zh-Hant':
+ locales['zh-Hant'] = allLocales['zh-Hant'];
+ break;
+ }
+ }
+ });
+
+ angular['projects']['ceph-dashboard']['i18n']['locales'] = locales;
+ const newAngular = JSON.stringify(angular, null, 2);
+
+ fs.writeFile(filename, newAngular, (err) => {
+ if (err) throw err;
+ logger(`Writing to ${filename}`);
+ });
+}
+
+function restoreLocales() {
+ fs.access(backup, fs.constants.F_OK, (err) => {
+ logger(`'${backup}' ${err ? 'does not exist' : 'exists'}`);
+
+ if (!err) {
+ fs.copyFile(backup, filename, (err) => {
+ if (err) throw err;
+ logger(`'${backup}' was copied to '${filename}'`);
+
+ fs.unlink(backup, (err) => {
+ if (err) throw err;
+ logger(`successfully deleted '${backup}'`);
+ });
+ });
+ }
+ });
+}
+
+function envBuild() {
+ origFile = 'src/environments/environment.tpl.ts';
+ devFile = 'src/environments/environment.ts';
+ prodFile = 'src/environments/environment.prod.ts';
+
+ const replacements = [
+ { from: '{DEFAULT_LANG}', to: process.env.npm_package_config_locale },
+ { from: '{COPYRIGHT_YEAR}', to: new Date().getFullYear() }
+ ];
+ let dev = replacements.concat([{ from: `'{PRODUCTION}'`, to: false }]);
+ let prod = replacements.concat([{ from: `'{PRODUCTION}'`, to: true }]);
+
+ fs.copyFile(origFile, devFile, (err) => {
+ if (err) throw err;
+ logger(`'${origFile}' was copied to '${devFile}'`);
+
+ replace(devFile, dev);
+ });
+
+ fs.copyFile(origFile, prodFile, (err) => {
+ if (err) throw err;
+ logger(`'${origFile}' was copied to '${prodFile}'`);
+
+ replace(prodFile, prod);
+ });
+}
+
+/**
+ * Replace strings in a file.
+ *
+ * @param {*} filename Relative path to the file
+ * @param {*} replacements List of replacements, each should have from' and 'to'
+ * proprieties.
+ */
+function replace(filename, replacements) {
+ fs.readFile(filename, 'utf8', (err, data) => {
+ if (err) throw err;
+
+ replacements.forEach((rep) => {
+ data = data.replace(rep.from, rep.to);
+ });
+
+ fs.writeFile(filename, data, 'utf8', (err) => {
+ if (err) throw err;
+ logger(`Placeholders were replace in '${filename}'`);
+ });
+ });
+}
+
+/**
+ * Writes logs to the console using the [cd.js] prefix
+ */
+function logger(message) {
+ console.log(`[cd.js] ${message}`);
+}