Line data Source code
1 : /*
2 : * Copyright (C) 2016 Red Hat, Inc.
3 : * SPDX-License-Identifier: LGPL-2.1-or-later
4 : */
5 :
6 : import '../lib/patternfly/patternfly-6-cockpit.scss';
7 : import 'polyfills'; // once per application
8 : import 'cockpit-dark-theme'; // once per page
9 :
10 : import cockpit from "cockpit";
11 :
12 3 : import React from "react";
13 3 : import { createRoot } from "react-dom/client";
14 :
15 : import { KdumpPage } from "./kdump-view.jsx";
16 : import * as kdumpClient from "./kdump-client.js";
17 : import { superuser } from "superuser";
18 : import { WithDialogs } from "dialogs.jsx";
19 :
20 : import './kdump.scss';
21 :
22 3 : superuser.reload_page_on_change();
23 :
24 3 : const initStore = function(rootElement) {
25 3 : const root = createRoot(rootElement);
26 3 : const dataStore = { };
27 3 : dataStore.domRootElement = rootElement;
28 :
29 3 : dataStore.kdumpClient = new kdumpClient.KdumpClient();
30 :
31 2 : dataStore.saveSettings = settings =>
32 2 : dataStore.kdumpClient.validateSettings(settings)
33 2 : .then(() => dataStore.kdumpClient.writeSettings(settings));
34 :
35 0 : dataStore.exportConfig = settings =>
36 0 : dataStore.kdumpClient.exportConfig(settings);
37 :
38 : // whether we're actively trying to change the state
39 3 : dataStore.stateChanging = false;
40 0 : function setServiceState(_event, desiredState) {
41 0 : if (dataStore.stateChanging) {
42 0 : console.log("already trying to change state");
43 0 : return;
44 0 : }
45 0 : const promise = desiredState ? dataStore.kdumpClient.ensureOn() : dataStore.kdumpClient.ensureOff();
46 0 : dataStore.stateChanging = true;
47 0 : dataStore.render();
48 0 : promise
49 0 : .catch(error => console.warn("Failed to change kdump state:", error))
50 0 : .finally(() => {
51 0 : dataStore.stateChanging = false;
52 0 : dataStore.render();
53 0 : });
54 0 : }
55 3 : const render = function() {
56 3 : root.render(<WithDialogs>{React.createElement(KdumpPage, {
57 3 : kdumpActive: false,
58 3 : onSetServiceState: setServiceState,
59 3 : stateChanging: dataStore.stateChanging,
60 3 : reservedMemory: dataStore.kdumpMemory,
61 3 : kdumpStatus: dataStore.kdumpStatus,
62 3 : kdumpCmdlineEnabled: dataStore.crashkernel || false,
63 3 : onSaveSettings: dataStore.saveSettings,
64 3 : onCrashKernel: dataStore.kdumpClient.crashKernel,
65 3 : exportConfig: dataStore.exportConfig,
66 3 : })}</WithDialogs>);
67 3 : };
68 3 : dataStore.render = render;
69 :
70 3 : const crashkernelPromise = cockpit.file("/proc/cmdline").read()
71 3 : .then(content => {
72 3 : if (content !== null) {
73 3 : dataStore.crashkernel = content.indexOf('crashkernel=') !== -1;
74 3 : }
75 3 : })
76 0 : .catch(err => console.error("cannot read /proc/cmdline", err));
77 :
78 : // read memory reserved for kdump from system
79 3 : dataStore.kdumpMemory = undefined;
80 3 : const crashsizePromise = cockpit.file("/sys/kernel/kexec_crash_size").read()
81 3 : .then(content => {
82 3 : const value = parseInt(content, 10);
83 3 : if (!isNaN(value)) {
84 : // if it's only a number, guess from the size what units we should use
85 : // https://access.redhat.com/solutions/59432 states limit to be 896MiB and the auto at 768MiB max
86 : // default unit is MiB
87 3 : if (value >= 1024 * 1024)
88 0 : dataStore.kdumpMemory = value;
89 3 : else if (value >= 1024)
90 0 : dataStore.kdumpMemory = value * 1024;
91 : else
92 3 : dataStore.kdumpMemory = value * 1024 * 1024;
93 0 : } else {
94 0 : dataStore.kdumpMemory = 0;
95 0 : }
96 3 : })
97 0 : .catch(() => { dataStore.kdumpMemory = "error" });
98 :
99 3 : Promise.allSettled([crashkernelPromise, crashsizePromise]).then(render);
100 :
101 : // catch kdump config and service changes
102 3 : dataStore.kdumpClient.addEventListener('kdumpStatusChanged', function(event, status) {
103 3 : dataStore.kdumpStatus = status;
104 3 : render();
105 3 : });
106 :
107 : // render once
108 3 : render();
109 :
110 3 : return dataStore;
111 3 : };
112 :
113 3 : document.addEventListener("DOMContentLoaded", function() {
114 3 : initStore(document.getElementById('app'));
115 3 : });
|