diff options
| author | nippy <you@example.com> | 2026-04-18 13:49:56 +0200 |
|---|---|---|
| committer | nippy <you@example.com> | 2026-04-18 13:49:56 +0200 |
| commit | 5d94c0a7d44a2255b81815a52a7056a94a39842d (patch) | |
| tree | 759bdea9645c6a62f9e1e4c001f7d81cccd120d2 /raveos-theme/gnome/theme-data/extensions/installed/customreboot@nova1545/grub.js | |
| parent | e79cdf210b267f21a186255ce1a4d50029439d54 (diff) | |
| download | RaveOS-PKGBUILD-5d94c0a7d44a2255b81815a52a7056a94a39842d.tar.gz RaveOS-PKGBUILD-5d94c0a7d44a2255b81815a52a7056a94a39842d.zip | |
update Raveos themes
Diffstat (limited to 'raveos-theme/gnome/theme-data/extensions/installed/customreboot@nova1545/grub.js')
| -rw-r--r-- | raveos-theme/gnome/theme-data/extensions/installed/customreboot@nova1545/grub.js | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/raveos-theme/gnome/theme-data/extensions/installed/customreboot@nova1545/grub.js b/raveos-theme/gnome/theme-data/extensions/installed/customreboot@nova1545/grub.js new file mode 100644 index 0000000..6d67ff0 --- /dev/null +++ b/raveos-theme/gnome/theme-data/extensions/installed/customreboot@nova1545/grub.js @@ -0,0 +1,205 @@ +import Gio from "gi://Gio"; +import { ExecCommand, Log, LogWarning } from './utils.js'; + +/** + * Represents grub + */ +export class Grub { + /** + * Get's all available boot options + * @returns {[Map, string]} Map(title, id), defaultOption + */ + static async GetBootOptions() { + try { + let cfgpath = await this.GetConfig(); + if (cfgpath == "") { + throw new String("Failed to find grub config"); + } + + let bootOptions = new Map(); + + let defualtEn = ""; + + let file = Gio.file_new_for_path(cfgpath); + let [suc, content] = file.load_contents(null); + if (!suc) { + throw new String("Failed to load grub config"); + } + + let lines; + if (content instanceof Uint8Array) { + lines = new TextDecoder().decode(content); + } + else { + lines = content.toString(); + } + + let entryRx = /^menuentry ['"]([^'"]+)/; + let defaultRx = /(?<=set default=\")([A-Za-z- ()/0-9]*)(?=\")/ + lines.split('\n').forEach(l => { + let res = entryRx.exec(l); + if (res && res.length) { + bootOptions.set(res[1], res[1]); + } + let def = defaultRx.exec(l); + if (def && def.length) { + defualtEn = def[0]; + } + }); + + bootOptions.forEach((v, k) => { + Log(`${k} = ${v}`); + }); + + if (defualtEn == "") defualtEn = bootOptions.keys().next().value; + + return [bootOptions, defualtEn]; + + } 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) { + try { + let [status, stdout, stderr] = await ExecCommand( + ['/usr/bin/pkexec', '/usr/sbin/grub-reboot', id], + ); + Log(`Set boot option to ${id}: ${status}\n${stdout}\n${stderr}`); + return true; + } catch (e) { + LogWarning(e); + return false; + } + } + + /** + * Can we use this bootloader? + * @returns True if useable otherwise false + */ + static async IsUseable() { + return await this.GetConfig() !== ""; + } + + /** + * Get's grub config file + * @returns A string containing the location of the config file, if none is found returns a blank string + */ + static async GetConfig() { + let paths = ["/boot/grub/grub.cfg", "/boot/grub2/grub.cfg"]; + + 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 ""; + } + + /** + * Copies a custom grub script to allow the extension to quickly reboot into another OS + * If anyone reads this: Idk how to combine these into one pkexec call, if you do please leave a commit fixing it + */ + static async EnableQuickReboot(ext) { + try { + let [status, stdout, stderr] = await ExecCommand([ + 'pkexec', + 'sh', + '-c', + `/usr/bin/cp ${ext.lookupByUUID('customreboot@nova1545').path()}/42_custom_reboot /etc/grub.d/42_custom_reboot && /usr/bin/chmod 755 /etc/grub.d/42_custom_reboot && /usr/sbin/update-grub` + ]); + + if (status !== 0) { + return false; + } + + return true; + } + catch (e) { + LogWarning(e); + return false; + } + } + + + /** + * Removes the script used to allow the extension to quickly reboot into another OS without waiting for grub's timeout + * If anyone reads this: Idk how to combine these into one pkexec call, if you do please leave a commit fixing it + */ + static async DisableQuickReboot() { + try { + + let [status, stdout, stderr] = await ExecCommand([ + 'pkexec', + 'sh', + '-c', + '/usr/bin/rm /etc/grub.d/42_custom_reboot && /usr/sbin/update-grub' + ]); + + if (status !== 0) { + return false; + } + + return true; + } + catch (e) { + LogWarning(e); + return false; + } + } + + + /** + * This boot loader can be quick rebooted + */ + static async CanQuickReboot() { + return true; + } + + /** + * Checks if /etc/grub.d/42_custom_reboot exists + */ + static async QuickRebootEnabled() { + try { + let [status, stdout, stderr] = await ExecCommand(['/usr/bin/cat', '/etc/grub.d/42_custom_reboot'],); + if (status !== 0) { + LogWarning(`/etc/grub.d/42_custom_reboot not found`); + return false; + } + Log(`/etc/grub.d/42_custom_reboot found`); + + return true; + } + catch (e) { + LogWarning(e); + return false; + } + } + + static async SetReadable() { + try { + const config = GetConfig(); + let [status, stdout, stderr] = await ExecCommand(['/usr/bin/pkexec', '/usr/bin/chmod', '644', config],); + if (status !== 0) { + Log(`Failed to make ${config} readable`); + return false; + } + Log(`Made ${config} readable`); + return true; + } + catch (e) { + Log(e); + return false; + } + } +}
\ No newline at end of file |