* Copyright (C) 2016 Red Hat, Inc.
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
import '../lib/patternfly/patternfly-6-cockpit.scss';
import 'polyfills';
import 'cockpit-dark-theme';
import cockpit from "cockpit";
import React from "react";
import { createRoot } from "react-dom/client";
import { KdumpPage } from "./kdump-view.jsx";
import * as kdumpClient from "./kdump-client.js";
import { superuser } from "superuser";
import { WithDialogs } from "dialogs.jsx";
import './kdump.scss';
superuser.reload_page_on_change();
const initStore = function(rootElement) {
const root = createRoot(rootElement);
const dataStore = { };
dataStore.domRootElement = rootElement;
dataStore.kdumpClient = new kdumpClient.KdumpClient();
dataStore.saveSettings = settings =>
dataStore.kdumpClient.validateSettings(settings)
.then(() => dataStore.kdumpClient.writeSettings(settings));
dataStore.exportConfig = settings =>
dataStore.kdumpClient.exportConfig(settings);
dataStore.stateChanging = false;
function setServiceState(_event, desiredState) {
if (dataStore.stateChanging) {
console.log("already trying to change state");
return;
}
const promise = desiredState ? dataStore.kdumpClient.ensureOn() : dataStore.kdumpClient.ensureOff();
dataStore.stateChanging = true;
dataStore.render();
promise
.catch(error => console.warn("Failed to change kdump state:", error))
.finally(() => {
dataStore.stateChanging = false;
dataStore.render();
});
}
const render = function() {
root.render(<WithDialogs>{React.createElement(KdumpPage, {
kdumpActive: false,
onSetServiceState: setServiceState,
stateChanging: dataStore.stateChanging,
reservedMemory: dataStore.kdumpMemory,
kdumpStatus: dataStore.kdumpStatus,
kdumpCmdlineEnabled: dataStore.crashkernel || false,
onSaveSettings: dataStore.saveSettings,
onCrashKernel: dataStore.kdumpClient.crashKernel,
exportConfig: dataStore.exportConfig,
})}</WithDialogs>);
};
dataStore.render = render;
const crashkernelPromise = cockpit.file("/proc/cmdline").read()
.then(content => {
if (content !== null) {
dataStore.crashkernel = content.indexOf('crashkernel=') !== -1;
}
})
.catch(err => console.error("cannot read /proc/cmdline", err));
dataStore.kdumpMemory = undefined;
const crashsizePromise = cockpit.file("/sys/kernel/kexec_crash_size").read()
.then(content => {
const value = parseInt(content, 10);
if (!isNaN(value)) {
if (value >= 1024 * 1024)
dataStore.kdumpMemory = value;
else if (value >= 1024)
dataStore.kdumpMemory = value * 1024;
else
dataStore.kdumpMemory = value * 1024 * 1024;
} else {
dataStore.kdumpMemory = 0;
}
})
.catch(() => { dataStore.kdumpMemory = "error" });
Promise.allSettled([crashkernelPromise, crashsizePromise]).then(render);
dataStore.kdumpClient.addEventListener('kdumpStatusChanged', function(event, status) {
dataStore.kdumpStatus = status;
render();
});
render();
return dataStore;
};
document.addEventListener("DOMContentLoaded", function() {
initStore(document.getElementById('app'));
});