Skip to content

Commit 69c7038

Browse files
committed
Save default boot option
1 parent 342719f commit 69c7038

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

src/app.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ const _ = cockpit.gettext;
3636

3737
type Pages = "advanced" | "boot-options" | "kernel-params";
3838

39-
const SelectedPage = ({ page, grub }: { page: Pages, grub: GrubFile }) => {
39+
const SelectedPage = ({ page, grub, setBootEntry }: { page: Pages, grub: GrubFile, setBootEntry: (entry: string) => void }) => {
4040
switch (page) {
4141
case "advanced":
4242
return <AdvancedValues grub={grub} />;
4343
case "boot-options":
44-
return <BootOptions />;
44+
return <BootOptions setBootEntry={setBootEntry} />;
4545
case "kernel-params":
4646
return <KernelParameters grub={grub} />;
4747
default:
@@ -113,10 +113,11 @@ export const Application = () => {
113113
const [page, setPage] = React.useState<Pages>("kernel-params");
114114
const [hasGrub, setHasGrub] = useState<boolean | undefined>(undefined);
115115
const [updatingGrub, setUpdatingGrub] = useState(false);
116+
const [bootEntry, setBootEntry] = useState<string | null>(null);
116117
const [authenticated, setAuthenticated] = React.useState(superuser.allowed);
117118

118119
const updateGrub = React.useCallback(() => {
119-
if (grub) {
120+
if (grub && page !== "boot-options") {
120121
setUpdatingGrub(true);
121122
cockpit.file('/etc/default/grub', { superuser: "require" })
122123
.replace(grub.toFile()).then(() => {
@@ -131,8 +132,16 @@ export const Application = () => {
131132
console.error(reason);
132133
setUpdatingGrub(false);
133134
});
135+
} else if (bootEntry) {
136+
setUpdatingGrub(true);
137+
cockpit.spawn(["grub2-set-default", bootEntry], { superuser: "require" })
138+
.then(() => console.log("grub2-set-default success"))
139+
.catch((reason) => {
140+
console.error(reason);
141+
})
142+
.finally(() => setUpdatingGrub(false));
134143
}
135-
}, [grub]);
144+
}, [grub, bootEntry]);
136145

137146
const resetGrub = () => {
138147
// setting grub value to null first forces the state to reload
@@ -209,7 +218,7 @@ export const Application = () => {
209218
</FlexItem>
210219
</Flex>
211220
</PageSection>
212-
{grub ? <SelectedPage page={page} grub={grub} /> : null}
221+
{grub ? <SelectedPage page={page} grub={grub} setBootEntry={setBootEntry} /> : null}
213222
</Page>
214223
</WithDialogs>
215224
);

src/pages/boot_options.tsx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,24 @@ import React, { useEffect, useState } from 'react';
22

33
import { Form, FormGroup, FormSelect, FormSelectOption } from '@patternfly/react-core';
44
import cockpit from 'cockpit';
5-
import { fsinfo } from 'cockpit/fsinfo';
5+
// import { fsinfo } from 'cockpit/fsinfo';
66

77
const _ = cockpit.gettext;
88

9-
export const BootOptions = () => {
9+
export const BootOptions = ({ setBootEntry }: { setBootEntry: (entry: string) => void }) => {
1010
const [bootEntries, setBootEntries] = useState<string[]>([]);
11-
const [hasGrubBoot, setHasGrubBoot] = useState<boolean | undefined>(undefined);
12-
const [selectedBoot, setSelectedBoot] = useState<string>("defult?");
11+
// const [hasGrubBoot, setHasGrubBoot] = useState<boolean | undefined>(undefined);
12+
const [selectedBoot, setSelectedBoot] = useState<string>("");
13+
14+
const setEntry = (entry: string) => {
15+
setBootEntry(entry);
16+
setSelectedBoot(entry);
17+
};
1318

1419
useEffect(() => {
15-
fsinfo('/boot/grub2/grub.cfg', [])
16-
.then(() => setHasGrubBoot(true))
17-
.catch(() => setHasGrubBoot(false));
20+
// fsinfo('/boot/grub2/grub.cfg', [])
21+
// .then(() => setHasGrubBoot(true))
22+
// .catch(() => setHasGrubBoot(false));
1823

1924
const bootConfig = cockpit.file('/boot/grub2/grub.cfg', { superuser: 'require' });
2025
bootConfig.watch(content => {
@@ -32,7 +37,7 @@ export const BootOptions = () => {
3237
return (
3338
<Form>
3439
<FormGroup label={_("Console resolution")} fieldId="graphical-console-resolution">
35-
<FormSelect value={selectedBoot} onChange={(_event, value) => setSelectedBoot(value)}>
40+
<FormSelect value={selectedBoot} onChange={(_event, value) => setEntry(value)}>
3641
{bootEntries.map((value, idx) =>
3742
<FormSelectOption key={idx} label={value} value={value} />
3843
)}

0 commit comments

Comments
 (0)