30 Commits

Author SHA1 Message Date
e77cbfa662 Fixed #181 2022-10-30 23:20:45 +08:00
967a302d8f update 2022-10-23 19:44:08 +08:00
7ab56dc587 Merge pull request #180 from hyttmi/master
Remove override of THEME_DIR
2022-10-23 19:37:13 +08:00
8303aa2825 Remove override of THEME_DIR 2022-10-23 08:46:09 +03:00
b10a5fd4c8 update 2022-10-15 23:57:32 +08:00
8627f86ce5 Merge pull request #178 from dotlogix/Feature/UbuntuDDE
Fix alignments of icons and add ubuntuDDE
2022-10-15 23:46:51 +08:00
fd78958d50 Fix alignments of icons and add ubuntuDDE 2022-10-15 16:31:52 +02:00
c6e2967f06 Merge pull request #175 from Rdkang/master
Added theme variant name to the preview image
2022-08-31 02:02:35 +08:00
6b58676c4d Added theme variant name to the preview image 2022-08-30 11:54:20 +01:00
fa74d1b6af Merge pull request #162 from thomassdk/FixNixOSSupport
Make splashImage option a `nullOr` type
2022-03-28 00:26:11 +08:00
29dd80dd70 Make splashImage option a nullOr type 2022-03-27 15:52:59 +00:00
20a8f12488 Merge pull request #161 from PatrickJosh/fix-fedora-34-and-later
Update install.sh to fix installation on Fedora 34 and later.
2022-03-26 21:20:58 +08:00
b5b4780418 Update install.sh to fix installation on Fedora 34 and later. 2022-03-26 10:50:37 +01:00
3f5624833d update 2022-03-19 10:55:49 +08:00
f4f3354233 Update install.sh 2022-03-19 10:32:20 +08:00
a4bff7bf91 Merge pull request #158 from AnotherGroupChat/nixos
Add NixOS support
2022-03-19 10:07:53 +08:00
86caf618c3 Merge branch 'vinceliuice:master' into nixos 2022-03-18 12:53:01 -04:00
4f3b99cdf3 Added footer and enable option 2022-02-21 11:59:04 -05:00
53f899da9c Merge pull request #155 from AnotherGroupChat/master
Added generate hook
2022-02-21 13:06:36 +08:00
2fd6eb9b66 Needs to exit 0 2022-02-20 23:00:36 -05:00
824064faa9 Move clear to remove busybox dependency 2022-02-20 22:46:11 -05:00
70ff68055b Added flake for grub on NixOS 2022-02-20 22:41:50 -05:00
e5b869f186 Added generate hook 2022-02-20 22:26:29 -05:00
9e440c4bbc Update install.sh 2022-01-22 18:29:10 +08:00
468bee78f5 Merge pull request #151 from The-Plottwist/master
Pull request for 149'th issue
2022-01-16 12:51:38 +08:00
9d244c9d07 Fixed issue #149
In the old functionality, the current config file was being replaced with a backup file (if it had presented).
However, we now back-up the config file and replace the active theme line instead.
2022-01-15 22:36:57 +03:00
d27e1caf5f Little fixes
Almost always ```read``` command should be used with ```-r``` option.
Added some clarity about globals.
2022-01-15 21:15:50 +03:00
2824010b86 Improved Readability
Added section headers and made some rearrangements to improve readability.
Removed discouraged '$?' usage.
Added install_program function.
2022-01-15 21:11:14 +03:00
f1e03b4949 update 2021-12-07 11:29:49 +08:00
41de75c50e Update README.md 2021-12-05 14:18:39 +08:00
52 changed files with 5727 additions and 5697 deletions

View File

@ -6,8 +6,7 @@ Usage: `sudo ./install.sh [OPTIONS...]`
| Options: | Description: |
|:-----------------------|:-------------|
| -b, --boot | Install grub theme into `/boot/grub/themes` |
| -t, --theme | theme variant(s) [tela/vimix/stylish/slaze/whitesur] (default is tela)"
| -t, --theme | theme variant(s) [tela/vimix/stylish/whitesur] (default is tela)"
| -i, --icon | icon variant(s) [color/white/whitesur] (default is color)"
| -s, --screen | screen resolution variant(s) [1080p/2k/4k/ultrawide/ultrawide2k] (default is 1080p)"
| -r, --remove [THEME] | Uninstall selected theme |
@ -51,6 +50,7 @@ _If no options are used, a user interface `dialog` will show up instead_
- If any issues occur, report then to the [issue](https://github.com/vinceliuice/grub2-themes/issues) page
## Preview:
Images shown: tela/vimix/stylish/whitesur
![preview](preview.png?raw=true)
## Documents

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1023 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 B

After

Width:  |  Height:  |  Size: 1005 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 B

After

Width:  |  Height:  |  Size: 587 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 803 B

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 803 B

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 803 B

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 803 B

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 987 B

After

Width:  |  Height:  |  Size: 994 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 987 B

After

Width:  |  Height:  |  Size: 994 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 987 B

After

Width:  |  Height:  |  Size: 994 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 987 B

After

Width:  |  Height:  |  Size: 994 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 162 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 124 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 197 KiB

View File

@ -42,7 +42,9 @@ neon
artix
kernel
zorin
nixos
gpart
ubuntuDDE
recovery
restart

120
flake.nix Normal file
View File

@ -0,0 +1,120 @@
{
description = "Flake to manage grub2 themes from vinceliuice";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/master";
};
outputs = { self, nixpkgs }:
let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
};
in
with nixpkgs.lib;
rec {
nixosModule = { config, ... }:
let
cfg = config.boot.loader.grub2-theme;
splashImage = if cfg.splashImage == null then "" else cfg.splashImage;
resolutions = {
"1080p" = "1920x1080";
"ultrawide" = "2560x1080";
"2k" = "2560x1440";
"4k" = "3840x2160";
"ultrawide2k" = "3440x1440";
};
grub2-theme = pkgs.stdenv.mkDerivation {
name = "grub2-theme";
src = "${self}";
installPhase = ''
mkdir -p $out/grub/themes;
bash ./install.sh \
--generate $out/grub/themes \
--screen ${cfg.screen} \
--theme ${cfg.theme} \
--icon ${cfg.icon};
if [ -n "${splashImage}" ]; then
cp ${splashImage} $out/grub/themes/${cfg.theme}/background.jpg;
fi;
if [ ${pkgs.lib.trivial.boolToString cfg.footer} == "false" ]; then
sed -i ':again;$!N;$!b again; s/\+ image {[^}]*}//g' $out/grub/themes/${cfg.theme}/theme.txt;
fi;
'';
};
resolution = resolutions."${cfg.screen}";
in
rec {
options = {
boot.loader.grub2-theme = {
enable = mkOption {
default = true;
example = true;
type = types.bool;
description = ''
Enable grub2 theming
'';
};
theme = mkOption {
default = "tela";
example = "tela";
type = types.enum [ "tela" "vimix" "stylish" "whitesur" ];
description = ''
The theme to use for grub2.
'';
};
icon = mkOption {
default = "white";
example = "white";
type = types.enum [ "color" "white" "whitesur" ];
description = ''
The icon to use for grub2.
'';
};
screen = mkOption {
default = "1080p";
example = "1080p";
type = types.enum [ "1080p" "2k" "4k" "ultrawide" "ultrawide2k" ];
description = ''
The screen resolution to use for grub2.
'';
};
splashImage = mkOption {
default = null;
example = "/my/path/background.jpg";
type = types.nullOr types.path;
description = ''
The path of the image to use for background (must be jpg).
'';
};
footer = mkOption {
default = true;
example = true;
type = types.bool;
description = ''
Whether to include the image footer.
'';
};
};
};
config = mkIf cfg.enable (mkMerge [{
environment.systemPackages = [
grub2-theme
];
boot.loader.grub = {
theme = "${grub2-theme}/grub/themes/${cfg.theme}";
splashImage = "${grub2-theme}/grub/themes/${cfg.theme}/background.jpg";
gfxmodeEfi = "${resolution},auto";
gfxmodeBios = "${resolution},auto";
extraConfig = ''
insmod gfxterm
insmod png
set icondir=($root)/theme/icons
'';
};
}]);
};
};
}

View File

@ -1,10 +1,8 @@
#! /usr/bin/env bash
# Grub2 Themes
set -o errexit
# Exit Immediately if a command fails
set -o errexit
[ GLOBAL::CONF ]
{
readonly ROOT_UID=0
readonly Project_Name="GRUB2::THEMES"
readonly MAX_DELAY=20 # max delay for user to enter root password
@ -12,13 +10,15 @@ tui_root_login=
THEME_DIR="/usr/share/grub/themes"
REO_DIR="$(cd $(dirname $0) && pwd)"
}
THEME_VARIANTS=('tela' 'vimix' 'stylish' 'whitesur')
ICON_VARIANTS=('color' 'white' 'whitesur')
SCREEN_VARIANTS=('1080p' '2k' '4k' 'ultrawide' 'ultrawide2k')
#COLORS
#################################
# :::::: C O L O R S :::::: #
#################################
CDEF=" \033[0m" # default color
CCIN=" \033[0;36m" # info color
CGSC=" \033[0;32m" # success color
@ -30,6 +30,10 @@ b_CGSC=" \033[1;32m" # bold success color
b_CRER=" \033[1;31m" # bold error color
b_CWAR=" \033[1;33m" # bold warning color
#######################################
# :::::: F U N C T I O N S :::::: #
#######################################
# echo like ... with flag type and display message colors
prompt () {
case ${1} in
@ -49,20 +53,65 @@ prompt () {
# Check command availability
function has_command() {
command -v $1 > /dev/null
command -v $1 &> /dev/null #with "&>", all output will be redirected.
}
usage() {
printf "%s\n" "Usage: ${0##*/} [OPTIONS...]"
printf "\n%s\n" "OPTIONS:"
printf " %-25s%s\n" "-b, --boot" "install grub theme into /boot/grub/themes"
printf " %-25s%s\n" "-t, --theme" "theme variant(s) [tela|vimix|stylish|whitesur] (default is tela)"
printf " %-25s%s\n" "-i, --icon" "icon variant(s) [color|white|whitesur] (default is color)"
printf " %-25s%s\n" "-s, --screen" "screen display variant(s) [1080p|2k|4k|ultrawide|ultrawide2k] (default is 1080p)"
printf " %-25s%s\n" "-r, --remove" "Remove theme (must add theme name option)"
printf " %-25s%s\n" "-g, --generate" "do not install, but generate theme into chosen directory"
printf " %-25s%s\n" "-h, --help" "Show this help"
}
generate() {
if [[ "${install_boot}" == 'true' ]]; then
if [[ -d "/boot/grub" ]]; then
THEME_DIR='/boot/grub/themes'
elif [[ -d "/boot/grub2" ]]; then
THEME_DIR='/boot/grub2/themes'
fi
fi
# Make a themes directory if it doesn't exist
prompt -s "\n Checking for the existence of themes directory..."
[[ -d "${THEME_DIR}/${theme}" ]] && rm -rf "${THEME_DIR}/${theme}"
mkdir -p "${THEME_DIR}/${theme}"
# Copy theme
prompt -s "\n Installing ${theme} ${icon} ${screen} theme..."
# Don't preserve ownership because the owner will be root, and that causes the script to crash if it is ran from terminal by sudo
cp -a --no-preserve=ownership "${REO_DIR}/common/"{*.png,*.pf2} "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/config/theme-${screen}.txt" "${THEME_DIR}/${theme}/theme.txt"
cp -a --no-preserve=ownership "${REO_DIR}/backgrounds/${screen}/background-${theme}.jpg" "${THEME_DIR}/${theme}/background.jpg"
# Use custom background.jpg as grub background image
if [[ -f "${REO_DIR}/background.jpg" ]]; then
prompt -w "\n Using custom background.jpg as grub background image..."
cp -a --no-preserve=ownership "${REO_DIR}/background.jpg" "${THEME_DIR}/${theme}/background.jpg"
convert -auto-orient "${THEME_DIR}/${theme}/background.jpg" "${THEME_DIR}/${theme}/background.jpg"
fi
if [[ ${screen} == 'ultrawide' ]]; then
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-${icon}/icons-1080p" "${THEME_DIR}/${theme}/icons"
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-select/select-1080p/"*.png "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/assets/info-1080p.png" "${THEME_DIR}/${theme}/info.png"
elif [[ ${screen} == 'ultrawide2k' ]]; then
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-${icon}/icons-2k" "${THEME_DIR}/${theme}/icons"
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-select/select-2k/"*.png "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/assets/info-2k.png" "${THEME_DIR}/${theme}/info.png"
else
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-${icon}/icons-${screen}" "${THEME_DIR}/${theme}/icons"
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-select/select-${screen}/"*.png "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/assets/info-${screen}.png" "${THEME_DIR}/${theme}/info.png"
fi
}
install() {
local theme=${1}
local icon=${2}
@ -72,40 +121,8 @@ install() {
if [[ "$UID" -eq "$ROOT_UID" ]]; then
clear
# Create themes directory if it didn't exist
prompt -s "\n Checking for the existence of themes directory..."
[[ -d "${THEME_DIR}/${theme}" ]] && rm -rf "${THEME_DIR}/${theme}"
mkdir -p "${THEME_DIR}/${theme}"
# Copy theme
prompt -s "\n Installing ${theme} ${icon} ${screen} theme..."
# Don't preserve ownership because the owner will be root, and that causes the script to crash if it is ran from terminal by sudo
cp -a --no-preserve=ownership "${REO_DIR}/common/"{*.png,*.pf2} "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/config/theme-${screen}.txt" "${THEME_DIR}/${theme}/theme.txt"
cp -a --no-preserve=ownership "${REO_DIR}/backgrounds/${screen}/background-${theme}.jpg" "${THEME_DIR}/${theme}/background.jpg"
# Use custom background.jpg as grub background image
if [[ -f "${REO_DIR}/background.jpg" ]]; then
prompt -w "\n Using custom background.jpg as grub background image..."
cp -a --no-preserve=ownership "${REO_DIR}/background.jpg" "${THEME_DIR}/${theme}/background.jpg"
convert -auto-orient "${THEME_DIR}/${theme}/background.jpg" "${THEME_DIR}/${theme}/background.jpg"
fi
if [[ ${screen} == 'ultrawide' ]]; then
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-${icon}/icons-1080p" "${THEME_DIR}/${theme}/icons"
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-select/select-1080p/"*.png "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/assets/info-1080p.png" "${THEME_DIR}/${theme}/info.png"
elif [[ ${screen} == 'ultrawide2k' ]]; then
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-${icon}/icons-2k" "${THEME_DIR}/${theme}/icons"
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-select/select-2k/"*.png "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/assets/info-2k.png" "${THEME_DIR}/${theme}/info.png"
else
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-${icon}/icons-${screen}" "${THEME_DIR}/${theme}/icons"
cp -a --no-preserve=ownership "${REO_DIR}/assets/assets-select/select-${screen}/"*.png "${THEME_DIR}/${theme}"
cp -a --no-preserve=ownership "${REO_DIR}/assets/info-${screen}.png" "${THEME_DIR}/${theme}/info.png"
fi
# Generate the theme in "/usr/share/grub/themes"
generate "${theme}" "${icon}" "${screen}"
# Set theme
prompt -s "\n Setting ${theme} as default..."
@ -182,51 +199,53 @@ install() {
fi
# Update grub config
prompt -s "\n Updating grub config...\n"
prompt -s "\n Updating grub config..."
updating_grub
prompt -w "\n * At the next restart of your computer you will see your new Grub theme: '$theme' "
else
#Check if password is cached (if cache timestamp not expired yet)
sudo -n true 2> /dev/null && echo
if [[ $? == 0 ]]; then
#No need to ask for password
sudo "$0" -t ${theme} -i ${icon} -s ${screen}
#Check if password is cached (if cache timestamp has not expired yet)
elif sudo -n true 2> /dev/null && echo; then
if [[ "${install_boot}" == 'true' ]]; then
sudo "$0" -t ${theme} -i ${icon} -s ${screen} -b
else
#Ask for password
if [[ -n ${tui_root_login} ]] ; then
if [[ -n "${theme}" && -n "${screen}" ]]; then
sudo "$0" -t ${theme} -i ${icon} -s ${screen}
fi
else
#Ask for password
if [[ -n ${tui_root_login} ]] ; then
if [[ -n "${theme}" && -n "${screen}" ]]; then
if [[ "${install_boot}" == 'true' ]]; then
sudo -S $0 -t ${theme} -i ${icon} -s ${screen} -b <<< ${tui_root_login}
else
sudo -S $0 -t ${theme} -i ${icon} -s ${screen} <<< ${tui_root_login}
fi
else
prompt -e "\n [ Error! ] -> Run me as root! "
read -p " [ Trusted ] Specify the root password : " -t ${MAX_DELAY} -s
sudo -S echo <<< $REPLY 2> /dev/null && echo
if [[ $? == 0 ]]; then
#Correct password, use with sudo's stdin
sudo -S "$0" -t ${theme} -i ${icon} -s ${screen} <<< ${REPLY}
fi
else
prompt -e "\n [ Error! ] -> Run me as root! "
read -r -p " [ Trusted ] Specify the root password : " -t ${MAX_DELAY} -s
if sudo -S echo <<< $REPLY 2> /dev/null && echo; then
#Correct password, use with sudo's stdin
if [[ "${install_boot}" == 'true' ]]; then
sudo -S "$0" -t ${theme} -i ${icon} -s ${screen} -b <<< ${REPLY}
else
#block for 3 seconds before allowing another attempt
sleep 3
prompt -e "\n [ Error! ] -> Incorrect password!\n"
exit 1
sudo -S "$0" -t ${theme} -i ${icon} -s ${screen} <<< ${REPLY}
fi
else
#block for 3 seconds before allowing another attempt
sleep 3
prompt -e "\n [ Error! ] -> Incorrect password!\n"
exit 1
fi
fi
fi
fi
}
run_dialog() {
if [[ -x /usr/bin/dialog ]]; then
if [[ "$UID" -ne "$ROOT_UID" ]]; then
#Check if password is cached (if cache timestamp not expired yet)
sudo -n true 2> /dev/null && echo
if [[ $? == 0 ]]; then
if sudo -n true 2> /dev/null && echo; then
#No need to ask for password
sudo $0
else
@ -237,9 +256,7 @@ run_dialog() {
--passwordbox "require root permission" 8 50 \
--output-fd 1 )
sudo -S echo <<< $tui_root_login 2> /dev/null && echo
if [[ $? == 0 ]]; then
if sudo -S echo <<< $tui_root_login 2> /dev/null && echo; then
#Correct password, use with sudo's stdin
sudo -S "$0" <<< $tui_root_login
else
@ -310,12 +327,12 @@ updating_grub() {
elif has_command zypper; then
grub2-mkconfig -o /boot/grub2/grub.cfg
elif has_command dnf; then
if [[ -f /boot/efi/EFI/fedora/grub.cfg ]]; then
prompt -i "Find config file on /boot/efi/EFI/fedora/grub.cfg ...\n"
if [[ -f /boot/efi/EFI/fedora/grub.cfg ]] && (( $(cat /etc/fedora-release | awk '{print $3}') < 34 )); then
prompt -i "\n Find config file on /boot/efi/EFI/fedora/grub.cfg ...\n"
grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
fi
if [[ -f /boot/grub2/grub.cfg ]]; then
prompt -i "Find config file on /boot/grub2/grub.cfg ...\n"
prompt -i "\n Find config file on /boot/grub2/grub.cfg ...\n"
grub2-mkconfig -o /boot/grub2/grub.cfg
fi
fi
@ -324,20 +341,24 @@ updating_grub() {
prompt -s "\n * All done!"
}
function install_program () {
if has_command zypper; then
zypper in "$@"
elif has_command apt-get; then
apt-get install "$@"
elif has_command dnf; then
dnf install -y "$@"
elif has_command yum; then
yum install "$@"
elif has_command pacman; then
pacman -S --noconfirm "$@"
fi
}
install_dialog() {
if [ ! "$(which dialog 2> /dev/null)" ]; then
prompt -w "\n 'dialog' need to be installed for this shell"
if has_command zypper; then
sudo zypper in dialog
elif has_command apt-get; then
sudo apt-get install dialog
elif has_command dnf; then
sudo dnf install -y dialog
elif has_command yum; then
sudo yum install dialog
elif has_command pacman; then
sudo pacman -S --noconfirm dialog
fi
install_program "dialog"
fi
}
@ -346,49 +367,63 @@ remove() {
# Check for root access and proceed if it is present
if [ "$UID" -eq "$ROOT_UID" ]; then
echo -e "\n Checking for the existence of themes directory..."
prompt -i "\n Checking for the existence of themes directory..."
if [[ -d "${THEME_DIR}/${theme}" ]]; then
prompt -s "\n Find installed theme: '${THEME_DIR}/${theme}'..."
rm -rf "${THEME_DIR}/${theme}"
prompt -w "Removed: '${THEME_DIR}/${theme}'..."
elif [[ -d "/boot/grub/themes/${theme}" ]]; then
prompt -s "\n Find installed theme: '/boot/grub/themes/${theme}'..."
rm -rf "/boot/grub/themes/${theme}"
prompt -w "\n Removed: '/boot/grub/themes/${theme}'..."
elif [[ -d "/boot/grub2/themes/${theme}" ]]; then
prompt -s "\n Find installed theme: '/boot/grub2/themes/${theme}'..."
rm -rf "/boot/grub2/themes/${theme}"
prompt -w "\n Removed: '/boot/grub2/themes/${theme}'..."
else
prompt -e "\n ${theme} grub theme not exist!"
prompt -e "\n Specified ${theme} theme does not exist!"
exit 0
fi
# Backup grub config
if [[ -f "/etc/default/grub.bak" ]]; then
rm -rf /etc/default/grub && mv /etc/default/grub.bak /etc/default/grub
local grub_config_location=""
if [[ -f "/etc/default/grub" ]]; then
grub_config_location="/etc/default/grub"
elif [[ -f "/etc/default/grub.d/kali-themes.cfg" ]]; then
grub_config_location="/etc/default/grub.d/kali-themes.cfg"
else
prompt -e "\n grub.bak not exist!"
exit 0
prompt -e "\nCannot find grub config file in default locations!"
prompt -e "\nPlease inform the developers by opening an issue on github."
prompt -e "\nExiting..."
exit 1
fi
# For Kali linux
if [[ -f "/etc/default/grub.d/kali-themes.cfg.bak" ]]; then
rm -rf /etc/default/grub.d/kali-themes.cfg && mv /etc/default/grub.d/kali-themes.cfg.bak /etc/default/grub.d/kali-themes.cfg
local current_theme="" # Declaration and assignment should be done seperately ==> https://github.com/koalaman/shellcheck/wiki/SC2155
current_theme="$(grep 'GRUB_THEME=' $grub_config_location | grep -v \#)"
if [[ -n "$current_theme" ]]; then
# Backup with --in-place option to grub.bak within the same directory; then remove the current theme.
sed --in-place='.bak' "s|$current_theme|#GRUB_THEME=|" "$grub_config_location"
# Update grub config
prompt -s "\n Resetting grub theme...\n"
updating_grub
else
prompt -e "\nNo active theme found."
prompt -e "\nExiting..."
exit 1
fi
# Update grub config
prompt -s "\n Resetting grub theme...\n"
updating_grub
else
#Check if password is cached (if cache timestamp not expired yet)
sudo -n true 2> /dev/null && echo
if [[ $? == 0 ]]; then
if sudo -n true 2> /dev/null && echo; then
#No need to ask for password
sudo "$0" "${PROG_ARGS[@]}"
sudo "$0" -t ${theme} "${PROG_ARGS[@]}"
else
#Ask for password
prompt -e "\n [ Error! ] -> Run me as root! "
read -p " [ Trusted ] Specify the root password : " -t ${MAX_DELAY} -s
read -r -p " [ Trusted ] Specify the root password : " -t ${MAX_DELAY} -s #when using "read" command, "-r" option must be supplied ==> https://github.com/koalaman/shellcheck/wiki/SC2162
sudo -S echo <<< $REPLY 2> /dev/null && echo
if [[ $? == 0 ]]; then
if sudo -S echo <<< $REPLY 2> /dev/null && echo; then
#Correct password, use with sudo's stdin
sudo -S "$0" "${PROG_ARGS[@]}" <<< $REPLY
sudo -S "$0" -t ${theme} "${PROG_ARGS[@]}" <<< $REPLY
else
#block for 3 seconds before allowing another attempt
sleep 3
@ -404,19 +439,16 @@ dialog_installer() {
if [[ ! -x /usr/bin/dialog ]]; then
if [[ $UID -ne $ROOT_UID ]]; then
#Check if password is cached (if cache timestamp not expired yet)
sudo -n true 2> /dev/null && echo
if [[ $? == 0 ]]; then
if sudo -n true 2> /dev/null && echo; then
#No need to ask for password
exec sudo $0
else
#Ask for password
prompt -e "\n [ Error! ] -> Run me as root! "
read -p " [ Trusted ] Specify the root password : " -t ${MAX_DELAY} -s
read -r -p " [ Trusted ] Specify the root password : " -t ${MAX_DELAY} -s
sudo -S echo <<< $REPLY 2> /dev/null && echo
if [[ $? == 0 ]]; then
if sudo -S echo <<< $REPLY 2> /dev/null && echo; then
#Correct password, use with sudo's stdin
sudo $0 <<< $REPLY
else
@ -431,20 +463,33 @@ dialog_installer() {
fi
run_dialog
install "${theme}" "${icon}" "${screen}"
exit 1
}
#######################################################
# :::::: A R G U M E N T H A N D L I N G :::::: #
#######################################################
install=install
while [[ $# -gt 0 ]]; do
PROG_ARGS+=("${1}")
dialog='false'
case "${1}" in
-b|--boot)
THEME_DIR="/boot/grub/themes"
shift 1
;;
-r|--remove)
remove='true'
shift 1
;;
-g|--generate)
shift 1
THEME_DIR="${1}"
install=generate
shift 1
;;
-b|--boot)
install_boot='true'
shift 1
;;
-t|--theme)
shift
for theme in "${@}"; do
@ -465,7 +510,7 @@ while [[ $# -gt 0 ]]; do
themes+=("${THEME_VARIANTS[3]}")
shift
;;
-*|--*)
-*)
break
;;
*)
@ -492,7 +537,7 @@ while [[ $# -gt 0 ]]; do
icons+=("${ICON_VARIANTS[2]}")
shift
;;
-*|--*)
-*)
break
;;
*)
@ -527,7 +572,7 @@ while [[ $# -gt 0 ]]; do
screens+=("${SCREEN_VARIANTS[4]}")
shift
;;
-*|--*)
-*)
break
;;
*)
@ -550,13 +595,17 @@ while [[ $# -gt 0 ]]; do
esac
done
#############################
# :::::: M A I N :::::: #
#############################
# Show terminal user interface for better use
if [[ "${dialog:-}" == 'false' ]]; then
if [[ "${remove:-}" != 'true' ]]; then
for theme in "${themes[@]-${THEME_VARIANTS[0]}}"; do
for icon in "${icons[@]-${ICON_VARIANTS[0]}}"; do
for screen in "${screens[@]-${SCREEN_VARIANTS[0]}}"; do
install "${theme}" "${icon}" "${screen}"
$install "${theme}" "${icon}" "${screen}"
done
done
done
@ -569,4 +618,4 @@ if [[ "${dialog:-}" == 'false' ]]; then
dialog_installer
fi
exit 1
exit 0