summaryrefslogtreecommitdiff
path: root/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/systemdBoot.js
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/systemdBoot.js')
-rw-r--r--raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/systemdBoot.js121
1 files changed, 121 insertions, 0 deletions
diff --git a/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/systemdBoot.js b/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/systemdBoot.js
new file mode 100644
index 0000000..51d4e6e
--- /dev/null
+++ b/raveos-gnome-theme/theme-data/extensions/installed/customreboot@nova1545/systemdBoot.js
@@ -0,0 +1,121 @@
+import Gio from "gi://Gio";
+import { ExecCommand, Log, LogWarning } from './utils.js';
+
+/**
+ * Represents Systemdboot
+ */
+export class SystemdBoot {
+ /**
+ * Get's all available boot options
+ * @returns {[Map, string]} Map(title, id), defaultOption
+ */
+ static async GetBootOptions() {
+ let bootctl = await this.GetBinary();
+ if (bootctl == "") {
+ Log(`Failed to find bootctl binary`);
+ return undefined;
+ }
+
+ try {
+ let [status, stdout, stderr] = await ExecCommand([bootctl, "list"]);
+ if (status !== 0)
+ throw new Error(`Failed to get list from bootctl: ${status}\n${stdout}\n${stderr}`);
+ Log(`bootctl list: ${status}\n${stdout}\n${stderr}`);
+ let lines = String(stdout).split('\n');
+ let titleRx = /(?<=title:\s+).+/;
+ let idRx = /(?<=id:\s+).+/;
+ let defaultRx = /\(default\)/;
+ let titles = [];
+ let ids = []
+ let defaultOpt;
+ lines.forEach(l => {
+ let title = titleRx.exec(l);
+ let id = idRx.exec(l);
+ if (title && title.length) {
+ titles.push(String(title));
+ } else if (id && id.length) {
+ ids.push(String(id));
+ }
+ });
+ if (titles.length !== ids.length)
+ throw new Error("Number of titles and ids do not match!");
+ let bootOptions = new Map();
+ for (let i = 0; i < titles.length; i++) {
+ bootOptions.set(titles[i], ids[i])
+ }
+
+ bootOptions.forEach((id, title) => {
+ Log(`${id} = ${title}`);
+
+ let defaultRes = defaultRx.exec(title);
+
+ if (defaultRes) {
+ defaultOpt = title;
+ }
+ })
+
+ return [bootOptions, bootOptions.get(defaultOpt)];
+ } catch (e) {
+ LogWarning(e);
+ return undefined;
+ }
+ }
+
+ /**
+ * Set's the next boot option
+ * @param {string} id
+ * @returns True if the boot option was set, otherwise false
+ */
+ static async SetBootOption(id) {
+ if (!this.IsUseable()) return false;
+ const [status, stdout, stderr] = await ExecCommand(['/usr/bin/pkexec', '/usr/bin/bootctl', 'set-oneshot', id],);
+ if (status === 0) {
+ Log(`Set boot option to ${id}`);
+ return true;
+ }
+ LogWarning("Unable to set boot option using bootctl");
+ return false;
+ }
+
+
+ /**
+ * Can we use this bootloader?
+ * @returns True if useable otherwise false
+ */
+ static async IsUseable() {
+ return await this.GetBinary() !== "";
+ }
+
+ /**
+ * Get's bootctl binary path
+ * @returns A string containing the location of the binary, if none is found returns a blank string
+ */
+ static async GetBinary() {
+ let paths = ["/usr/sbin/bootctl", "/usr/bin/bootctl"];
+
+ let file;
+
+ for (let i = 0; i < paths.length; i++) {
+ file = Gio.file_new_for_path(paths[i]);
+ if (file.query_exists(null)) {
+ return paths[i];
+ }
+ }
+
+ return "";
+ }
+
+ /**
+ * This boot loader cannot be quick rebooted
+ */
+ static async CanQuickReboot() {
+ return false;
+ }
+
+ /**
+ * This boot loader cannot be quick rebooted
+ */
+ static async QuickRebootEnabled() {
+ return false;
+ }
+}