From b46cf2175d7bc545fe4c969f2b982ed8f0cc14c6 Mon Sep 17 00:00:00 2001 From: Geoff Murphy <murphy@fake.onl> Date: Sat, 21 Oct 2023 19:10:43 +1100 Subject: [PATCH] Initial commit --- README.md | 66 +++++++++ setup.sh | 132 ++++++++++++++++++ .../assets/configs/initrc/initrc_ash.sh | 5 + .../assets/configs/initrc/initrc_bash.sh | 5 + .../assets/configs/issue/issue-net.txt | 4 + src/fake-os/assets/configs/issue/issue.txt | 4 + src/fake-os/assets/logos/logo.txt | 9 ++ src/fake-os/assets/logos/logo_full.txt | 9 ++ src/fake-os/assets/logos/logo_text.txt | 7 + src/fake-os/assets/other/demo.png | Bin 0 -> 47942 bytes src/fake-os/fake_init.sh | 99 +++++++++++++ src/fake-os/modules/debug/fake_debug.sh | 13 ++ .../modules/debug/fake_debug_error_pause.sh | 12 ++ .../modules/environment/hw_bootloader.sh | 10 ++ .../modules/environment/hw_cpu_arch.sh | 6 + .../modules/environment/hw_cpu_make.sh | 11 ++ .../modules/environment/hw_gpu_make.sh | 12 ++ .../modules/environment/hw_mb_chipset.sh | 32 +++++ src/fake-os/modules/environment/hw_memory.sh | 6 + .../modules/environment/hw_network_type.sh | 9 ++ src/fake-os/modules/environment/hw_virtual.sh | 24 ++++ src/fake-os/modules/environment/os_distro.sh | 16 +++ .../modules/environment/os_fake_version.sh | 6 + .../modules/environment/os_hostname.sh | 6 + .../modules/environment/os_init_system.sh | 9 ++ .../modules/environment/os_login_type.sh | 10 ++ .../modules/environment/os_package_manager.sh | 12 ++ src/fake-os/modules/environment/os_shell.sh | 6 + src/fake-os/modules/environment/os_users.sh | 6 + .../modules/layout/fake_layout_heading.sh | 14 ++ .../modules/layout/fake_layout_message.sh | 51 +++++++ .../modules/layout/fake_layout_subheading.sh | 10 ++ .../modules/layout/fake_layout_submessage.sh | 8 ++ src/fake-os/modules/manager/fake_manager.sh | 53 +++++++ .../modules/manager/fake_manager_help.sh | 30 ++++ .../modules/manager/fake_manager_upgrade.sh | 8 ++ .../fake_manager_package_automation.sh | 44 ++++++ .../package/fake_manager_package_install.sh | 120 ++++++++++++++++ .../package/fake_manager_package_remove.sh | 46 ++++++ .../package/fake_manager_package_search.sh | 45 ++++++ .../package/fake_manager_package_update.sh | 61 ++++++++ .../system/fake_manager_system_disable.sh | 38 +++++ .../system/fake_manager_system_enable.sh | 38 +++++ .../system/fake_manager_system_restart.sh | 34 +++++ .../system/fake_manager_system_start.sh | 41 ++++++ .../system/fake_manager_system_status.sh | 41 ++++++ .../system/fake_manager_system_stop.sh | 41 ++++++ .../modules/utils/alias/fake_alias_ls.sh | 10 ++ .../utils/config/fake_utils_config_add.sh | 36 +++++ .../utils/config/fake_utils_config_backup.sh | 14 ++ .../utils/config/fake_utils_config_pull.sh | 39 ++++++ .../utils/config/fake_utils_config_regex.sh | 47 +++++++ .../utils/config/fake_utils_config_replace.sh | 35 +++++ .../utils/config/fake_utils_config_restore.sh | 21 +++ .../environment/fake_environment_print.sh | 26 ++++ .../gnome/fake_utils_gnome_extensions.sh | 13 ++ .../utils/gnome/fake_utils_gnome_settings.sh | 22 +++ .../utils/linux/fake_utils_linux_appdata.sh | 15 ++ .../linux/fake_utils_linux_flushcache.sh | 26 ++++ .../linux/fake_utils_linux_shellstrap.sh | 15 ++ .../utils/linux/fake_utils_linux_status.sh | 34 +++++ 61 files changed, 1622 insertions(+) create mode 100755 README.md create mode 100755 setup.sh create mode 100755 src/fake-os/assets/configs/initrc/initrc_ash.sh create mode 100755 src/fake-os/assets/configs/initrc/initrc_bash.sh create mode 100644 src/fake-os/assets/configs/issue/issue-net.txt create mode 100644 src/fake-os/assets/configs/issue/issue.txt create mode 100644 src/fake-os/assets/logos/logo.txt create mode 100644 src/fake-os/assets/logos/logo_full.txt create mode 100644 src/fake-os/assets/logos/logo_text.txt create mode 100644 src/fake-os/assets/other/demo.png create mode 100755 src/fake-os/fake_init.sh create mode 100755 src/fake-os/modules/debug/fake_debug.sh create mode 100755 src/fake-os/modules/debug/fake_debug_error_pause.sh create mode 100755 src/fake-os/modules/environment/hw_bootloader.sh create mode 100755 src/fake-os/modules/environment/hw_cpu_arch.sh create mode 100755 src/fake-os/modules/environment/hw_cpu_make.sh create mode 100755 src/fake-os/modules/environment/hw_gpu_make.sh create mode 100755 src/fake-os/modules/environment/hw_mb_chipset.sh create mode 100755 src/fake-os/modules/environment/hw_memory.sh create mode 100755 src/fake-os/modules/environment/hw_network_type.sh create mode 100755 src/fake-os/modules/environment/hw_virtual.sh create mode 100755 src/fake-os/modules/environment/os_distro.sh create mode 100755 src/fake-os/modules/environment/os_fake_version.sh create mode 100755 src/fake-os/modules/environment/os_hostname.sh create mode 100755 src/fake-os/modules/environment/os_init_system.sh create mode 100755 src/fake-os/modules/environment/os_login_type.sh create mode 100755 src/fake-os/modules/environment/os_package_manager.sh create mode 100755 src/fake-os/modules/environment/os_shell.sh create mode 100755 src/fake-os/modules/environment/os_users.sh create mode 100755 src/fake-os/modules/layout/fake_layout_heading.sh create mode 100755 src/fake-os/modules/layout/fake_layout_message.sh create mode 100755 src/fake-os/modules/layout/fake_layout_subheading.sh create mode 100644 src/fake-os/modules/layout/fake_layout_submessage.sh create mode 100755 src/fake-os/modules/manager/fake_manager.sh create mode 100755 src/fake-os/modules/manager/fake_manager_help.sh create mode 100755 src/fake-os/modules/manager/fake_manager_upgrade.sh create mode 100755 src/fake-os/modules/manager/package/fake_manager_package_automation.sh create mode 100755 src/fake-os/modules/manager/package/fake_manager_package_install.sh create mode 100755 src/fake-os/modules/manager/package/fake_manager_package_remove.sh create mode 100755 src/fake-os/modules/manager/package/fake_manager_package_search.sh create mode 100755 src/fake-os/modules/manager/package/fake_manager_package_update.sh create mode 100755 src/fake-os/modules/manager/system/fake_manager_system_disable.sh create mode 100755 src/fake-os/modules/manager/system/fake_manager_system_enable.sh create mode 100755 src/fake-os/modules/manager/system/fake_manager_system_restart.sh create mode 100755 src/fake-os/modules/manager/system/fake_manager_system_start.sh create mode 100755 src/fake-os/modules/manager/system/fake_manager_system_status.sh create mode 100755 src/fake-os/modules/manager/system/fake_manager_system_stop.sh create mode 100755 src/fake-os/modules/utils/alias/fake_alias_ls.sh create mode 100755 src/fake-os/modules/utils/config/fake_utils_config_add.sh create mode 100755 src/fake-os/modules/utils/config/fake_utils_config_backup.sh create mode 100755 src/fake-os/modules/utils/config/fake_utils_config_pull.sh create mode 100644 src/fake-os/modules/utils/config/fake_utils_config_regex.sh create mode 100755 src/fake-os/modules/utils/config/fake_utils_config_replace.sh create mode 100755 src/fake-os/modules/utils/config/fake_utils_config_restore.sh create mode 100755 src/fake-os/modules/utils/environment/fake_environment_print.sh create mode 100755 src/fake-os/modules/utils/gnome/fake_utils_gnome_extensions.sh create mode 100755 src/fake-os/modules/utils/gnome/fake_utils_gnome_settings.sh create mode 100755 src/fake-os/modules/utils/linux/fake_utils_linux_appdata.sh create mode 100755 src/fake-os/modules/utils/linux/fake_utils_linux_flushcache.sh create mode 100755 src/fake-os/modules/utils/linux/fake_utils_linux_shellstrap.sh create mode 100755 src/fake-os/modules/utils/linux/fake_utils_linux_status.sh diff --git a/README.md b/README.md new file mode 100755 index 0000000..c6da2f0 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +# FAKE // OS +FAKE//OS system utilities and scripts. + + + +# Philosophy +1. **Standardised:** Functions should work consistently across multiple Operating System Distrobutions. +2. **Repeatable:** Functions should be able to re-run (for ugrade purposes) without destroying already modified system configurations. +3. **Modularity:** Functions should be simple and modular for easy additions and modifications. +3. **Error Handeling:** Functions should have good error handeling for use in automated scripts. + +# Supported Operating Systems +FAKE//OS aims to be system agnostic, and provide a consistent set of functions (especially for scripting) across a variety of Linux distrobutions, which otherwise don't play well togehter. Currently supported distrobutions include: +- Arch Linux _[bash + systemd + pacman/paru]_ +- Artix Linux _[bash + openrc + pacman/paru]_ +- Alpine Linux _[ash + openrc + apk]_ +- Debian Linux _[bash/dash + systemd + apt]_ + +# Basic Ussage +``` bash +FAKE//OS Package and System Manager +----------------------------------- +usage: fake <command> <arguments> + +Package management commands: + install Install new software packages + update Update installed software packages + remove Remove/Uninstall software packages + search Search repository for software packages + +Init/System management commands + start Start system daemons + stop Stop system daemons + restart Restart system daemons + enable Add system daemons to default startup PID + disable Remove system daemons from default startup PID + flush Clear syste caches + +FAKE//OS commands: + upgrade Upgrade FAKE//OS to latest git version + help Display this help screen +``` + +# Install FAKE // OS +### Automatic Install +Copy and paste the folloing into you're commandline terminal: + +``` bash +curl https://git.fake.onl/fake/fake-os/raw/branch/master/setup.sh | sh +``` + +### Manual Install +For manual installation and access to the source-code run the following commands: + +``` bash +git clone https://git.fake.onl/fake/fake-os.git +cd fake-os +./setup.sh +``` + +### Upgrade Install +Once installed FAKE//OS can be upgraded (install the latest version from git.fake.onl) by running the following command: + +``` bash +fake upgrade +``` diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..8b5d153 --- /dev/null +++ b/setup.sh @@ -0,0 +1,132 @@ +#!/usr/bin/env sh + + + +#--------[ Bootstrap Correct Shell ]--------# +if [ "$(command -v bash)" ] && [ -z "$BASH_VERSION" ]; then bash setup.sh $@; fi +if [ "$(command -v bash)" ] && [ -z "$BASH_VERSION" ]; then exit; fi + + + +#--------[ Check Root ]--------# +if [ $(whoami) != "root" ]; then + echo "" + echo "FAKE//OS setup must be run as 'root'" + echo "" + exit 1 +fi + + + +#--------[ Check Install Method ]--------# +if [ ! -d "src/fake-os" ]; then + rm -rf /tmp/fake-os + git clone --depth 1 https://git.fake.onl/fake/fake-os.git /tmp/fake-os + cd /tmp/fake-os +fi + + + +#--------[ Check Version ]--------# +if [ -f "/var/cache/fake-os/fake_version.txt" ]; then + export TMP_VERSION_LOCAL="$(cat /var/cache/fake-os/fake_version.txt)" + export TMP_VERSION_REMOTE="$(git rev-parse HEAD | head -c 10)" + if [ "$TMP_VERSION_LOCAL" == "$TMP_VERSION_REMOTE" ]; then + if [ "$(command -v _fake_layout_message)" ]; then + _fake_layout_message "Version" "$ENV_FAKE_VERSION" "upgrade" "Already up to date..." + else + echo "" + echo "FAKE//OS: Already up to date..." + echo "" + fi + exit 0 + fi + unset TMP_VERSION_LOCAL + unset TMP_VERSION_REMOTE +else + echo "" + cat src/fake-os/assets/logos/logo_full.txt + echo "" + sleep 1 +fi + + + +#--------[ CLI Flag Arguments ]--------# +for ARGV in $@; do + case $ARGV in + -d|--debug) export FAKE_MODE_DEBUG="TRUE" ;; + -v|--quiet) export FAKE_MODE_QUIET="TRUE" ;; + esac +done + + + +#--------[ Copy FAKE//OS Files ]--------# +echo "Copy FAKE//OS Files" +rm -rf /usr/share/fake-os +cp -rv src/fake-os /usr/share +mkdir -p /var/cache/fake-os +echo "" + + + +#--------[ Log FAKE//OS Version Variable ]--------# +echo "$(git rev-parse HEAD | head -c 10)" > /var/cache/fake-os/fake_version.txt + + + +#--------[ Install Dependencies ]--------# +echo "Install FAKE//OS Dependencies" +if [ "$(command -v paru)" ]; then + paru --noconfirm -S curl figlet git lolcat rsync perl sudo vim +elif [ "$(command -v pacman)" ]; then + pacman --noconfirm -S curl figlet git lolcat rsync perl sudo vim +elif [ "$(command -v apt)" ]; then + apt -y install curl figlet git lolcat rsync perl sudo vim +elif [ "$(command -v apk)" ]; then + apk add curl figlet git rsync perl sudo vim +fi + + + +#--------[ Load FAKE//OS Init Script ]--------# +. src/fake-os/fake_init.sh --quiet + + + +#--------[ Copy User RC Init Script ]--------# +mkdir -p /etc/skel + +_fake_layout_heading "Copy InitRC Script" +cp -rv src/fake-os/assets/configs/initrc/initrc_$ENV_SHELL.sh /etc/skel/.bashrc +cp -rv src/fake-os/assets/configs/initrc/initrc_$ENV_SHELL.sh /etc/skel/.profile + +cp -rv /etc/skel/. /root +for TMP_USER in $(ls /home); do + if [ ! "$(grep -e fake_init /home/$TMP_USER/.bashrc)" ]; then + cp -rv /etc/skel/. /home/$TMP_USER/ + fi +done +unset TMP_USER + + + +#--------[ Clean Up Junk Files ]--------# +_fake_layout_heading "Clean-Up Distro OS Files" + +_fake_utils_config_replace src/fake-os/assets/configs/issue/issue.txt /etc/issue +_fake_utils_config_regex "%ENV_DISTRO" "$ENV_DISTRO" "/etc/issue" +_fake_utils_config_regex "%ENV_FAKE_VERSION" "$ENV_FAKE_VERSION" "/etc/issue" + +_fake_utils_config_replace src/fake-os/assets/configs/issue/issue-net.txt /etc/issue.net +_fake_utils_config_regex "%ENV_DISTRO" "$ENV_DISTRO" "/etc/issue.net" +_fake_utils_config_regex "%ENV_FAKE_VERSION" "$ENV_FAKE_VERSION" "/etc/issue.net" + +rm -rf /etc/motd +echo 'rm -rf /etc/motd' + + + +#--------[ Setup Complete ]--------# +_fake_layout_heading "FAKE//OS Setup Complete!" diff --git a/src/fake-os/assets/configs/initrc/initrc_ash.sh b/src/fake-os/assets/configs/initrc/initrc_ash.sh new file mode 100755 index 0000000..ac3043f --- /dev/null +++ b/src/fake-os/assets/configs/initrc/initrc_ash.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env ash + + +#--------[ FAKE//OS Init Bootstrap ]--------# +. /usr/share/fake-os/fake_init.sh $@ diff --git a/src/fake-os/assets/configs/initrc/initrc_bash.sh b/src/fake-os/assets/configs/initrc/initrc_bash.sh new file mode 100755 index 0000000..5ff8494 --- /dev/null +++ b/src/fake-os/assets/configs/initrc/initrc_bash.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + + +#--------[ FAKE//OS Init Bootstrap ]--------# +. /usr/share/fake-os/fake_init.sh $@ diff --git a/src/fake-os/assets/configs/issue/issue-net.txt b/src/fake-os/assets/configs/issue/issue-net.txt new file mode 100644 index 0000000..f150dc1 --- /dev/null +++ b/src/fake-os/assets/configs/issue/issue-net.txt @@ -0,0 +1,4 @@ + +%ENV_DISTRO: \r (\l) [remote] +FAKE//OS Version: %ENV_FAKE_VERSION + diff --git a/src/fake-os/assets/configs/issue/issue.txt b/src/fake-os/assets/configs/issue/issue.txt new file mode 100644 index 0000000..8b6bd00 --- /dev/null +++ b/src/fake-os/assets/configs/issue/issue.txt @@ -0,0 +1,4 @@ + +%ENV_DISTRO: \r (\l) +FAKE//OS Version: %ENV_FAKE_VERSION + diff --git a/src/fake-os/assets/logos/logo.txt b/src/fake-os/assets/logos/logo.txt new file mode 100644 index 0000000..39d1522 --- /dev/null +++ b/src/fake-os/assets/logos/logo.txt @@ -0,0 +1,9 @@ + .^!?JJ?7^. + ^YB#GPYYYPGG?: + .5&&J^ .~Y5! + Y@&~ !P~ +:#@B .GP. + P@&? !GY + :P@@B5J?!: .7P5. + 7G&@@@@@7 :!?~ + ^7JYJ7. . diff --git a/src/fake-os/assets/logos/logo_full.txt b/src/fake-os/assets/logos/logo_full.txt new file mode 100644 index 0000000..48ea8ba --- /dev/null +++ b/src/fake-os/assets/logos/logo_full.txt @@ -0,0 +1,9 @@ + .. + .:xKX0O00d, _____ _ _ _______ ____ ___ ____ + dNKc. 'od' | ___/ \ | |/ / ____| / / / / _ \/ ___| + kWO .d, | |_ / _ \ | ' /| _| / / / | | | \___ \ +.WWc oO | _/ ___ \| . \| |___ / / / | |_| |___) | + 0WX. .kx |_|/_/ \_\_|\_\_____| /_/_/ \___/|____/ + xWWKOxo; 'xd --------------------------------------------- + 'oKWWWX' .. Fake Operating System + .. diff --git a/src/fake-os/assets/logos/logo_text.txt b/src/fake-os/assets/logos/logo_text.txt new file mode 100644 index 0000000..cdf67b3 --- /dev/null +++ b/src/fake-os/assets/logos/logo_text.txt @@ -0,0 +1,7 @@ + _____ _ _ _______ ____ ___ ____ +| ___/ \ | |/ / ____| / / / / _ \/ ___| +| |_ / _ \ | ' /| _| / / / | | | \___ \ +| _/ ___ \| . \| |___ / / / | |_| |___) | +|_|/_/ \_\_|\_\_____| /_/_/ \___/|____/ +--------------------------------------------- + Fake Operating System setup diff --git a/src/fake-os/assets/other/demo.png b/src/fake-os/assets/other/demo.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4be022bdac652a9ec8f8fa2b81dc13db748ba4 GIT binary patch literal 47942 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 C`?9$J literal 0 HcmV?d00001 diff --git a/src/fake-os/fake_init.sh b/src/fake-os/fake_init.sh new file mode 100755 index 0000000..abe5f6c --- /dev/null +++ b/src/fake-os/fake_init.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env sh + + + +#--------[ Master Paths ]--------# +if ! [ "$(echo $PATH | grep sbin)" ]; then + export PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin" +fi +if ! [ "$(echo $PATH | grep games)" ]; then + export PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin:/usr/games" +fi + + + +#--------[ System Variables ]--------# +export VISUAL=emacs +export EDITOR=vim + + + +#--------[ CLI Flag Arguments ]--------# +for ARGV in $@; do + case $ARGV in + -d|--degub) export FAKE_MODE_DEBUG="TRUE" ;; + -q|--quiet) export FAKE_MODE_QUIET="TRUE" ;; + esac +done + + + +#--------[ Terminal Colours ]--------# +FCOL0="\e[0m" +FCOL1="\e[37m\033[38;5;166m" +FCOL2="\e[37m\033[38;5;204m" +FCOL3="\e[37m\033[38;5;170m" +FCOLGRAD="lolcat -p 4 -S 6 -F 0.1" +FCOLBOLD="\e[1m" +FCOLITAL="\e[2;3m" + + + +#--------[ Load Core Modules ]--------# +for MODULE in $(find /usr/share/fake-os/modules -name "*.sh"); do + . $MODULE +done +unset MODULE + + + +#--------[ Load User Modules ]--------# +if [ ! -d ~/.local/share/fake-os/modules ]; then + mkdir -p ~/.local/share/fake-os/modules; +fi +for MODULE in $(find ~/.local/share/fake-os/modules -name "*.sh"); do + . $MODULE +done +unset MODULE + + + +#--------[ CLI Prompt ]--------# +if [ $(whoami) != "root" ]; then + PS1="\[${FCOL0}\]\[[${FCOL3}\]\u\[${FCOL0}\]@\[${FCOL3}\]\h\[${FCOL0}\]] \W \$ " +else + PS1="\[${FCOL0}\]\[[${FCOL1}\]\u\[${FCOL0}\]@\[${FCOL1}\]\h\[${FCOL0}\]] \W \$ " +fi + + + + +#--------[ Login Display ]--------# +echo "" +if [ ! "$FAKE_MODE_QUIET" ]; then + + +#--------[ Local Login ]--------# + if [ "$ENV_LOGIN" == "local" ]; then + if [ "$(command -v lolcat)" ]; then + cat /usr/share/fake-os/assets/logos/logo_full.txt | $FCOLGRAD + else + cat /usr/share/fake-os/assets/logos/logo_full.txt + fi + + + #--------[ SSH Login ]--------# + else + if [ "$(command -v figlet)" ]; then + figlet -w 1000 $(cat /etc/hostname) + else + echo "FAKE//OS Login: $(cat /etc/hostname)" + fi + fi + + + #--------[ Login Info ]--------# + echo "" + echo -e "${FCOL1}user:${FCOL0} $(whoami) ${FCOL2}login:${FCOL0} $ENV_LOGIN ${FCOL3}system:${FCOL0} $ENV_ARCH $ENV_DISTRO $ENV_VTAG" + echo "" +fi diff --git a/src/fake-os/modules/debug/fake_debug.sh b/src/fake-os/modules/debug/fake_debug.sh new file mode 100755 index 0000000..df2721c --- /dev/null +++ b/src/fake-os/modules/debug/fake_debug.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env sh + + + +#---------[ Fake Debug Pause Function ]--------# +_fake_debug () { + if [ "$FAKE_MODE_DEBUG" ]; then + echo "" + read -n 1 -p "Debug Break: Press key to continue..." VOID && echo "" + elif [ "$FAKE_MODE_SLOW" ]; then + sleep 3 + fi +} diff --git a/src/fake-os/modules/debug/fake_debug_error_pause.sh b/src/fake-os/modules/debug/fake_debug_error_pause.sh new file mode 100755 index 0000000..b486ced --- /dev/null +++ b/src/fake-os/modules/debug/fake_debug_error_pause.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh + + + +#--------[ Error Basic Message Function ]--------# +_fake_debug_error_pause () { + if [ "$FAKE_MODE_DEBUG" ]; then + read -n 1 -p "Error: Press any key to continue..." VOID && echo "" + elif [ "$FAKE_MODE_SLOW" ]; then + sleep 3 + fi +} diff --git a/src/fake-os/modules/environment/hw_bootloader.sh b/src/fake-os/modules/environment/hw_bootloader.sh new file mode 100755 index 0000000..0efacb0 --- /dev/null +++ b/src/fake-os/modules/environment/hw_bootloader.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Bootloader Type ]--------# +if [ -d "/sys/firmware/efi" ]; then + export ENV_BOOTLOADER="UEFI" +else + export ENV_BOOTLOADER="BIOS" +fi diff --git a/src/fake-os/modules/environment/hw_cpu_arch.sh b/src/fake-os/modules/environment/hw_cpu_arch.sh new file mode 100755 index 0000000..983ec55 --- /dev/null +++ b/src/fake-os/modules/environment/hw_cpu_arch.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + + + +#--------[ Detect CPU Architecture ]--------# +export ENV_ARCH=$(uname -m) diff --git a/src/fake-os/modules/environment/hw_cpu_make.sh b/src/fake-os/modules/environment/hw_cpu_make.sh new file mode 100755 index 0000000..70ab467 --- /dev/null +++ b/src/fake-os/modules/environment/hw_cpu_make.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + + + +#--------[ Detect CPU Make ]--------# +if [ "$(command -v lscpu)" ]; then + if [ "$(lscpu | grep Intel)" ]; then export ENV_CPU="intel"; + elif [ "$(lscpu | grep AMD)" ]; then export ENV_CPU="amd"; + elif [ "$(lscpu | grep ARM)" ]; then export ENV_CPU="arm"; + else export ENV_CPU="unkown"; fi +else export ENV_CPU="unkown"; fi diff --git a/src/fake-os/modules/environment/hw_gpu_make.sh b/src/fake-os/modules/environment/hw_gpu_make.sh new file mode 100755 index 0000000..983e454 --- /dev/null +++ b/src/fake-os/modules/environment/hw_gpu_make.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh + + + +#--------[ Detect GPU Make ]--------# +if [ -d "/proc/bus/pci" ] && [ "$(command -v lspci)" ]; then + if [ "$(lspci | grep VGA | grep Intel)" ]; then export ENV_GPU="intel"; + elif [ "$(lspci | grep VGA | grep GeForce)" ]; then export ENV_GPU="nvidia"; + elif [ "$(lspci | grep VGA | grep AMD)" ]; then export ENV_GPU="amd"; + else export ENV_GPU="unkown" + fi +else export ENV_GPU="unknown"; fi diff --git a/src/fake-os/modules/environment/hw_mb_chipset.sh b/src/fake-os/modules/environment/hw_mb_chipset.sh new file mode 100755 index 0000000..8a7103b --- /dev/null +++ b/src/fake-os/modules/environment/hw_mb_chipset.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Motherboard Chipset ]--------# +if [ -d "/sys/devices/virtual/dmi/id" ]; then + export ENV_MAKE=$(cat /sys/devices/virtual/dmi/id/sys_vendor) + export ENV_MODEL=$(cat /sys/devices/virtual/dmi/id/product_family) +elif [ -f "/proc/device-tree/model" ]; then + if [ "$(tr -d '\0' < /proc/device-tree/model | grep -a PineTab)" ]; then + export ENV_MAKE="Pine64" + export ENV_MODEL="PineTab" + elif [ "$(tr -d '\0' < /proc/device-tree/model | grep -a PinePhone)" ]; then + export ENV_MAKE="Pine64" + export ENV_MODEL="PinePhonePro" + elif [ "$(tr -d '\0' < /proc/device-tree/model | grep -a 'Zero W')" ]; then + export ENV_MAKE="RaspberryPi" + export ENV_MODEL="RPi-Zero-W" + elif [ "$(tr -d '\0' < /proc/device-tree/model | grep -a 'Pi 2')" ]; then + export ENV_MAKE="RaspberryPi" + export ENV_MODEL="RPi-2" + elif [ "$(tr -d '\0' < /proc/device-tree/model | grep -a 'Pi 4')" ]; then + export ENV_MAKE="RaspberryPi" + export ENV_MODEL="RPi-4" + else + export ENV_MAKE="unknown" + export ENV_MODEL="unknown" + fi +else + export ENV_MAKE="unknown" + export ENV_MODEL="unknown" +fi diff --git a/src/fake-os/modules/environment/hw_memory.sh b/src/fake-os/modules/environment/hw_memory.sh new file mode 100755 index 0000000..27e0ae6 --- /dev/null +++ b/src/fake-os/modules/environment/hw_memory.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + + + +#--------[ Memory Amount ]--------# +export ENV_MEMORY=$(free -h | grep 'Mem\|Speicher' | awk '{print $2}') diff --git a/src/fake-os/modules/environment/hw_network_type.sh b/src/fake-os/modules/environment/hw_network_type.sh new file mode 100755 index 0000000..02ef7c5 --- /dev/null +++ b/src/fake-os/modules/environment/hw_network_type.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Network Type ]--------# +export ENV_NETWORK="none" +if [ "$(ip addr | grep inet | grep wlan)" ]; then export ENV_NETWORK="wlan"; fi +if [ "$(ip addr | grep inet | grep eth)" ]; then export ENV_NETWORK="eth"; fi +if [ "$(ip addr | grep inet | grep enp)" ]; then export ENV_NETWORK="eth"; fi diff --git a/src/fake-os/modules/environment/hw_virtual.sh b/src/fake-os/modules/environment/hw_virtual.sh new file mode 100755 index 0000000..80f2d04 --- /dev/null +++ b/src/fake-os/modules/environment/hw_virtual.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Virtual/Container Environment ]--------# +if [ ! "$(cat /proc/1/environ 2>&1 | tr -d '\0' | grep denied)" ]; then + if [ "$(cat /proc/1/environ | tr -d '\0' | grep lxc)" ]; then + export ENV_VIRTUAL="LXC" + export ENV_VTAG="[LXC]" + elif [ "$ENV_MAKE" == "QEMU" ]; then + export ENV_VIRTUAL="VM" + export ENV_VTAG='[QEMU]' + else + export ENV_VIRTUAL="REAL" + fi + echo $ENV_VIRTUAL > /var/cache/fake-os/env_virtual.txt +else + if [ -f /var/cache/fake-os/env_virtual.txt ]; then + export ENV_VIRTUAL="$(cat /var/cache/fake-os/env_virtual.txt)" + if [ "$ENV_VIRTUAL" != "REAL" ]; then ENV_VTAG="[$ENV_VIRTUAL]"; fi + else + export ENV_VIRTUAL="UNKNOWN" + fi +fi diff --git a/src/fake-os/modules/environment/os_distro.sh b/src/fake-os/modules/environment/os_distro.sh new file mode 100755 index 0000000..4921752 --- /dev/null +++ b/src/fake-os/modules/environment/os_distro.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Operating System Distro ]--------# +export ENV_DISTRO=$(cat /etc/os-release | grep "^NAME=" | sed 's/^NAME="\(.*\)"$/\1/g') +if [ "$(command -v proxmox-boot-tool)" ]; then export ENV_DISTRO="Proxmox (Debian)"; fi +if [ "$(command -v raspi-config)" ]; then export ENV_DISTRO="RaspberryOS (Debian)"; fi + + +# "Arch Linux" +# "Artix Linux" +# "Debian GNU/Linux" +# "Fedora Linux" +# "Proxmox (Debian)" +# "RaspberryOS (Debian)" diff --git a/src/fake-os/modules/environment/os_fake_version.sh b/src/fake-os/modules/environment/os_fake_version.sh new file mode 100755 index 0000000..84561af --- /dev/null +++ b/src/fake-os/modules/environment/os_fake_version.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Fake Version ]--------# +export ENV_FAKE_VERSION="$(cat /var/cache/fake-os/fake_version.txt)" diff --git a/src/fake-os/modules/environment/os_hostname.sh b/src/fake-os/modules/environment/os_hostname.sh new file mode 100755 index 0000000..c015822 --- /dev/null +++ b/src/fake-os/modules/environment/os_hostname.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + + + +#--------[ Detect System Hostname ]--------# +export ENV_HOSTNAME=$(uname -n) diff --git a/src/fake-os/modules/environment/os_init_system.sh b/src/fake-os/modules/environment/os_init_system.sh new file mode 100755 index 0000000..12846f1 --- /dev/null +++ b/src/fake-os/modules/environment/os_init_system.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Init System ]--------# +if [ "$(command -v systemctl)" ]; then export ENV_INIT="systemd"; +elif [ "$(command -v rc-service)" ]; then export ENV_INIT="openrc"; +else export ENV_INIT="unknown"; +fi diff --git a/src/fake-os/modules/environment/os_login_type.sh b/src/fake-os/modules/environment/os_login_type.sh new file mode 100755 index 0000000..4eddc82 --- /dev/null +++ b/src/fake-os/modules/environment/os_login_type.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + + + +#--------[ Dettect Session Login Type ]--------# +if [ "$SSH_TTY" ]; then + ENV_LOGIN="ssh"; +else + ENV_LOGIN="local"; +fi diff --git a/src/fake-os/modules/environment/os_package_manager.sh b/src/fake-os/modules/environment/os_package_manager.sh new file mode 100755 index 0000000..9cd1f50 --- /dev/null +++ b/src/fake-os/modules/environment/os_package_manager.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh + + + +#--------[ Package Manager ]--------# +if [ "$(command -v paru)" ]; then export ENV_MANAGER="paru"; +elif [ "$(command -v pacman)" ]; then export ENV_MANAGER="pacman"; +elif [ "$(command -v apt)" ]; then export ENV_MANAGER="apt"; +elif [ "$(command -v apk)" ]; then export ENV_MANAGER="apk"; +elif [ "$(command -v dnf)" ]; then export ENV_MANAGER="dnf"; +elif [ "$(command -v yum)" ]; then export ENV_MANAGER="yum"; +else export ENV_MANAGER="unknown"; fi diff --git a/src/fake-os/modules/environment/os_shell.sh b/src/fake-os/modules/environment/os_shell.sh new file mode 100755 index 0000000..d0c0da7 --- /dev/null +++ b/src/fake-os/modules/environment/os_shell.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + + + +#--------[ Detect Shell ]--------# +export ENV_SHELL="$(echo $SHELL | sed 's/^\/.*\///g')" diff --git a/src/fake-os/modules/environment/os_users.sh b/src/fake-os/modules/environment/os_users.sh new file mode 100755 index 0000000..83b08d0 --- /dev/null +++ b/src/fake-os/modules/environment/os_users.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + + + +#--------[ Detect System Users ]--------# +export ENV_USERS=$( echo root $(ls /home/)) diff --git a/src/fake-os/modules/layout/fake_layout_heading.sh b/src/fake-os/modules/layout/fake_layout_heading.sh new file mode 100755 index 0000000..a2b6eb8 --- /dev/null +++ b/src/fake-os/modules/layout/fake_layout_heading.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh + + + +#--------[ Fake Layout Heading ]--------# +_fake_layout_heading () { + PADDING=$(perl -E "say \"─\" x $(echo $1 | wc -c)") + echo "" + echo "┌──$PADDING─┐" + echo -e "│ ${FCOLBOLD}$1${FCOL0} │" + echo "└──$PADDING─┘" + echo "" + if [ "$FAKE_MODE_SLOW" ]; then sleep 2; fi +} diff --git a/src/fake-os/modules/layout/fake_layout_message.sh b/src/fake-os/modules/layout/fake_layout_message.sh new file mode 100755 index 0000000..fbd083a --- /dev/null +++ b/src/fake-os/modules/layout/fake_layout_message.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env sh + + + +#--------[ Fake Layout Message ]--------# +_fake_layout_message () { + echo "" + + + + #--------[ 6 Arg Message ]--------# + if [ "$8" ]; then + echo -e "${FCOLBOLD}FAKE//OS${FCOL0} $1: $2" + echo -e "[$3]:${FCOLITAL} $4 ${FCOL0}"; + echo -e "[$5]:${FCOLITAL} $6 ${FCOL0}"; + echo -e "[$7]:${FCOLITAL} $8 ${FCOL0}"; + echo "" + + + + #--------[ 6 Arg Message ]--------# + elif [ "$6" ]; then + echo -e "${FCOLBOLD}FAKE//OS${FCOL0} $1: $2" + echo -e "[$3]:${FCOLITAL} $4 ${FCOL0}"; + echo -e "[$5]:${FCOLITAL} $6 ${FCOL0}"; + echo "" + + + + #--------[ 4 Arg Message ]--------# + elif [ "$4" ]; then + echo -e "${FCOLBOLD}FAKE//OS${FCOL0} $1: $2" + echo -e "[$3]:${FCOLITAL} $4 ${FCOL0}"; + echo "" + + + #--------[ 2 Argument Message ]--------# + elif [ "$2" ]; then + echo -e "${FCOLBOLD}FAKE//OS${FCOL0} $1:${FCOLITAL} $2 ${FCOL0}" + + + #--------[ 1 Argument Message ]--------# + else + echo -e "${FCOLBOLD}FAKE//OS${FCOL0}: $1" + fi + + + + #--------[ Debug Mode ]--------# + if [ "$1" == "Error" ] && [ "$FAKE_MODE_SLOW" ]; then sleep 3; fi +} diff --git a/src/fake-os/modules/layout/fake_layout_subheading.sh b/src/fake-os/modules/layout/fake_layout_subheading.sh new file mode 100755 index 0000000..f5f3b20 --- /dev/null +++ b/src/fake-os/modules/layout/fake_layout_subheading.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + + + +#--------[ Fake Layout Sub-Heading ]--------# +_fake_layout_subheading () { + echo "" + echo -e "--------[${FCOLBOLD} $1 ${FCOL0}]--------" + if [ "$FAKE_MODE_DEBUG" ]; then sleep 1; fi +} diff --git a/src/fake-os/modules/layout/fake_layout_submessage.sh b/src/fake-os/modules/layout/fake_layout_submessage.sh new file mode 100644 index 0000000..0943936 --- /dev/null +++ b/src/fake-os/modules/layout/fake_layout_submessage.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + + + +#--------[ Fake Layout Message ]--------# +_fake_layout_submessage () { + echo -e "[$1]:${FCOLITAL} $2 ${FCOL0}"; +} diff --git a/src/fake-os/modules/manager/fake_manager.sh b/src/fake-os/modules/manager/fake_manager.sh new file mode 100755 index 0000000..ebd32a6 --- /dev/null +++ b/src/fake-os/modules/manager/fake_manager.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env sh + + + +#--------[ Determin Base Distro Package Manager ]--------# +if [ $(command -v apt) ]; then FAKE_MANAGER=apt; fi +if [ $(command -v apk) ]; then FAKE_MANAGER=apk; fi +if [ $(command -v dnf) ]; then FAKE_MANAGER=dnf; fi +if [ $(command -v pacman) ]; then FAKE_MANAGER=pacman; fi +if [ $(command -v paru) ] && [ "$(whoami)" != "root" ]; then FAKE_MANAGER=paru; fi + + + +#--------[ FAKE//OS Package/System Manager ]--------# +fake () { + + + + #--------[ Package Management ]--------# + if [ "$1" == "update" ]; then _fake_manager_package_update $@; + elif [ "$1" == "install" ]; then _fake_manager_package_install $@; + elif [ "$1" == "remove" ]; then _fake_manager_package_remove $@; + elif [ "$1" == "search" ]; then _fake_manager_package_search $@; + + + + #--------[ Init/System Management ]--------# + elif [ "$1" == "status" ]; then _fake_manager_system_status $@; + elif [ "$1" == "start" ]; then _fake_manager_system_start $@; + elif [ "$1" == "stop" ]; then _fake_manager_system_stop $@; + elif [ "$1" == "restart" ]; then _fake_manager_system_restart $@; + elif [ "$1" == "enable" ]; then _fake_manager_system_enable $@; + elif [ "$1" == "disable" ]; then _fake_manager_system_disable $@; + elif [ "$1" == "flush" ]; then _fake_utils_linux_flushcache $@; + + + + #--------[ FAKE//OS Commandes ]--------# + elif [ "$1" == "upgrade" ]; then _fake_manager_upgrade $@; + elif [ "$1" == "help" ]; then _fake_manager_help $@; + + + + #--------[ Error Catch-All ]--------# + else + _fake_layout_message "$1" "Unrecognised command..." + fi + + + + #--------[ Debug Pause ]--------# + if [ "$FAKE_MODE_SLOW" ]; then sleep 3; fi +} diff --git a/src/fake-os/modules/manager/fake_manager_help.sh b/src/fake-os/modules/manager/fake_manager_help.sh new file mode 100755 index 0000000..543abd7 --- /dev/null +++ b/src/fake-os/modules/manager/fake_manager_help.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env sh + + + +#--------[ FAKE//OS Manager: Help ]--------# +_fake_manager_help () { + echo "" + echo "FAKE//OS [version] $ENV_FAKE_VERSION" + echo "-----------------------------------" + echo "usage: fake <command> <arguments>" + echo "" + echo "Package management commands:" + echo " install Install new software packages" + echo " update Update installed software packages" + echo " remove Remove/Uninstall software packages" + echo " search Search repository for software packages" + echo "" + echo "Init/System management commands" + echo " start Start system daemons" + echo " stop Stop system daemons" + echo " restart Restart system daemons" + echo " enable Add system daemons to default startup PID" + echo " disable Remove system daemons from default startup PID" + echo " flush Clear system caches" + echo "" + echo "FAKE//OS commands:" + echo " upgrade Upgrade FAKE//OS to latest git version" + echo " help Display this help screen" + echo "" +} diff --git a/src/fake-os/modules/manager/fake_manager_upgrade.sh b/src/fake-os/modules/manager/fake_manager_upgrade.sh new file mode 100755 index 0000000..4fd7370 --- /dev/null +++ b/src/fake-os/modules/manager/fake_manager_upgrade.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + + + +#--------[ FAKE//OS Manager: Upgrade FAKE//OS ]--------# +_fake_manager_upgrade () { + curl https://git.fake.onl/fake/fake-os/raw/branch/master/setup.sh | sudo $ENV_SHELL +} diff --git a/src/fake-os/modules/manager/package/fake_manager_package_automation.sh b/src/fake-os/modules/manager/package/fake_manager_package_automation.sh new file mode 100755 index 0000000..f12b2c0 --- /dev/null +++ b/src/fake-os/modules/manager/package/fake_manager_package_automation.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env sh + + + +#--------[ FAKE//OS Manager: Automation Function ]--------# +_fake_manager_package_automation () { + + + + #--------[ Parse Input Command ]--------# + FAKE_CMD="$@" + + + + #--------[ 4x Automatic Attmepts ]--------# + FAKE_RETRY=0 + until $FAKE_CMD; do + ((FAKE_RETRY=FAKE_RETRY+1)) + if [ $FAKE_RETRY -eq 4 ]; then break; fi + _fake_layout_message "Error" "Auto-Retry -> Attempt $FAKE_RETRY..." "retry" "$FAKE_CMD" + done + + + + #--------[ 1x Manual Attempt ]--------# + if [ $FAKE_RETRY -eq 4 ]; then + FAKE_CMD=$(echo $FAKE_CMD | sed -e 's/--noconfirm//g') + FAKE_CMD=$(echo $FAKE_CMD | sed -e 's/-y//g') + _fake_layout_message "Error" "Auto-Retry -> Attempt 4 [FINAL]..." "retry" "$FAKE_CMD" + $FAKE_CMD + + + + #--------[ Autmation Failure ]--------# + if [ $? -ne 0 ]; then + ((FAKE_RETRY=FAKE_RETRY+1)) + _fake_layout_message "Error" "$FAKE_CMD" "message" "Failed after 4x Auto and 1x Manual attempts..." + __fake_debug_error_pause + fi + fi + + + +} diff --git a/src/fake-os/modules/manager/package/fake_manager_package_install.sh b/src/fake-os/modules/manager/package/fake_manager_package_install.sh new file mode 100755 index 0000000..856d0b3 --- /dev/null +++ b/src/fake-os/modules/manager/package/fake_manager_package_install.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env sh + + + +#--------[ FAKE//OS Manager: Install Software ]--------# +_fake_manager_package_install () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify packages..." + + + + #--------[ Parse Package Arguments ]--------# + else + FAKE_PACKAGES=$(echo "$@" | sed -e 's/^install\ //g') + + + + #--------[ Get Pre-Installed System Pacakges ]--------# + SYS_PACKAGES="" + case $FAKE_MANAGER in + apt) SYS_PACKAGES="$(apt list --installed 2>/dev/null)" ;; + apk) SYS_PACKAGES="$(apk list --installed)" ;; + dnf) SYS_PACKAGES="$(dnf list --installed)" ;; + pacman) SYS_PACKAGES="$(pacman -Qq)" ;; + paru) SYS_PACKAGES="$(paru -Qq)" ;; + esac + + + + #--------[ Sort Packages Already Pre-Installed ]--------# + FAKE_PACKAGES_NEW="" + FAKE_PACKAGES_OLD="" + for TMP_PACKAGE in $FAKE_PACKAGES; do + if [ "$(echo $SYS_PACKAGES | grep $TMP_PACKAGE)" ]; then + FAKE_PACKAGES_OLD="$FAKE_PACKAGES_OLD $TMP_PACKAGE" + else + FAKE_PACKAGES_NEW="$FAKE_PACKAGES_NEW $TMP_PACKAGE" + fi + done + + + + #--------[ Determin Available Packages ]--------# + FAKE_PACKAGES_UNAVAILABLE="" + FAKE_PACKAGES_INSTALL="" + for TMP_PACKAGE in $FAKE_PACKAGES_NEW; do + TMP_FOUND=FALSE + case $FAKE_MANAGER in + apk) + if [ "$(apk search --exact $TMP_PACKAGE)" ];then TMP_FOUND=TRUE; fi + ;; + apt) + if [ "$(apt-cache search --names-only $TMP_PACKAGE | grep ^$TMP_PACKAGE\ )" ];then TMP_FOUND=TRUE; fi + ;; + pacman) + if [ "$(pacman -Ssq $TMP_PACKAGE | grep ^$TMP_PACKAGE$)" ];then TMP_FOUND=TRUE; fi + if [ "$(pacman -Sg $TMP_PACKAGE | awk '{print $1}' | grep ^$TMP_PACKAGE$)" ];then TMP_FOUND=TRUE; fi + ;; + paru) + if [ "$(paru -Ssq $TMP_PACKAGE | grep ^$TMP_PACKAGE$)" ];then TMP_FOUND=TRUE; fi + if [ "$(paru -Sg $TMP_PACKAGE | awk '{print $1}' | grep ^$TMP_PACKAGE$)" ];then TMP_FOUND=TRUE; fi + ;; + esac + if [ "$TMP_FOUND" == "TRUE" ]; then + FAKE_PACKAGES_INSTALL="$FAKE_PACKAGES_INSTALL $TMP_PACKAGE" + else + FAKE_PACKAGES_UNAVAILABLE="$FAKE_PACKAGES_UNAVAILABLE $TMP_PACKAGE" + fi + done + + + + #--------[ Build Install Command ]--------# + FAKE_CMD="" + case $FAKE_MANAGER in + apt) FAKE_CMD="sudo apt -y install $FAKE_PACKAGES_INSTALL" ;; + apk) FAKE_CMD="sudo apk add $FAKE_PACKAGES_INSTALL" ;; + dnf) FAKE_CMD="sudo dnf -y install $FAKE_PACKAGES_INSTALL" ;; + pacman) FAKE_CMD="sudo pacman --noconfirm -S $FAKE_PACKAGES_INSTALL" ;; + paru) FAKE_CMD="paru --noconfirm -S $FAKE_PACKAGES_INSTALL" ;; + esac + + + + #--------[ Skip Pre-Installed Pacakges ]--------# + if [ ! "$FAKE_PACKAGES_INSTALL" ]; then + _fake_layout_message "Install" "No new packages..." + if [ "$FAKE_PACKAGES_UNAVAILABLE" ]; then + _fake_layout_submessage "unavailable" "$FAKE_PACKAGES_UNAVAILABLE"; + _fake_debug_error_pause + fi + if [ "$FAKE_PACKAGES_OLD" ]; then _fake_layout_submessage "up to date" "$FAKE_PACKAGES_OLD"; fi + echo "" + fi + + + + #--------[ Install New Packages ]--------# + if [ "$FAKE_PACKAGES_INSTALL" ]; then + _fake_layout_message "Install" "$FAKE_CMD" + if [ "$FAKE_PACKAGES_UNAVAILABLE" ]; then + _fake_layout_submessage "unavailable" "$FAKE_PACKAGES_UNAVAILABLE" + _fake_debug_error_pause + fi + if [ "$FAKE_PACKAGES_OLD" ]; then _fake_layout_submessage "up to date" "$FAKE_PACKAGES_OLD"; fi + _fake_layout_submessage "installing" "$FAKE_PACKAGES_INSTALL" + echo "" + if [ "$FAKE_MODE_DEBUG" ] || [ "$FAKE_MODE_SLOW" ]; then sleep 3; fi + _fake_manager_package_automation "$FAKE_CMD" + _fake_debug + fi + + + + fi +} diff --git a/src/fake-os/modules/manager/package/fake_manager_package_remove.sh b/src/fake-os/modules/manager/package/fake_manager_package_remove.sh new file mode 100755 index 0000000..e986145 --- /dev/null +++ b/src/fake-os/modules/manager/package/fake_manager_package_remove.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env sh + + + +#--------[ FAKE//OS Manager: Remove/Uninstall Software ]--------# +_fake_manager_package_remove () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify packages..." + + + + #--------[ Parse Package Arguments ]--------# + else + FAKE_PACKAGES=$(echo "$@" | sed -e 's/^remove\ //g') + + + + #--------[ Compile Command ]--------# + FAKE_CMD="" + case $FAKE_MANAGER in + apt) FAKE_CMD="sudo apt -y remove $FAKE_PACKAGES" ;; + apk) FAKE_CMD="sudo apk del $FAKE_PACKAGES" ;; + yum) FAKE_CMD="sudo yum -y remove $FAKE_PACKAGES" ;; + pacman) FAKE_CMD="sudo pacman --noconfirm -R $FAKE_PACKAGES" ;; + paru) FAKE_CMD="paru --noconfirm -R $FAKE_PACKAGES" ;; + esac + + + + #--------[ Print Info ]--------# + _fake_layout_message "Remove" "$FAKE_CMD" "remove" "$FAKE_PACKAGES" + + + + + #--------[ Run Command ]--------# + $FAKE_CMD + + + + fi +} diff --git a/src/fake-os/modules/manager/package/fake_manager_package_search.sh b/src/fake-os/modules/manager/package/fake_manager_package_search.sh new file mode 100755 index 0000000..a3c1dc3 --- /dev/null +++ b/src/fake-os/modules/manager/package/fake_manager_package_search.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env sh + + + +#--------[ FAKE//OS Manager: Search Packages ]--------# +_fake_manager_package_search () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify packages..." + + + + #--------[ Parse Package Arguments ]--------# + else + FAKE_PACKAGES=$(echo "$@" | sed -e 's/^search\ //g') + + + + #--------[ Compile Command ]--------# + FAKE_CMD="" + case $FAKE_MANAGER in + apt) FAKE_CMD="apt-cache search $FAKE_PACKAGES" ;; + apk) FAKE_CMD="sudo apk search $FAKE_PACKAGES" ;; + dnf) FAKE_CMD="sudo dnf search $FAKE_PACKAGES" ;; + pacman) FAKE_CMD="pacman -Ss $FAKE_PACKAGES" ;; + paru) FAKE_CMD="paru -Ss $FAKE_PACKAGES" ;; + esac + + + + #--------[ Print Info ]--------# + _fake_layout_message "Search" "$FAKE_CMD" "search" "$FAKE_PACKAGES" + + + + #--------[ Run Command ]--------# + $FAKE_CMD + + + + fi +} diff --git a/src/fake-os/modules/manager/package/fake_manager_package_update.sh b/src/fake-os/modules/manager/package/fake_manager_package_update.sh new file mode 100755 index 0000000..97df590 --- /dev/null +++ b/src/fake-os/modules/manager/package/fake_manager_package_update.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env sh + + + +#--------[ FAKE//OS Manager: Update Software ]--------# +_fake_manager_package_update () { + + + + #--------[ Configure Packages And Command ]--------# + FAKE_PACKAGES="" + FAKE_CMD="" + if [ "$(whoami)" != "root" ]; then echo && echo -n -e "${FCOLBOLD}FAKE//OS${FCOL0} Update "; fi + case $FAKE_MANAGER in + apt) + sudo apt -y update + FAKE_CMD="sudo apt -y upgrade" + FAKE_PACKAGES="$(apt list --upgradable 2>/dev/null | grep -v 'Listing' | sed -e 's/\/.*$//g' | tr '\n' ' ')" + ;; + apk) + sudo apk update + FAKE_CMD="sudo apk upgrade" + FAKE_PACKAGES="$(apk list --upgradable | awk '{print $1}' | tr '\n' ' ')" + ;; + dnf) + sudo dnf -y update + FAKE_CMD="sudo yum -y upgrade" + ;; + pacman) + sudo pacman -Syyy + FAKE_CMD="sudo pacman --noconfirm -Su" + FAKE_PACKAGES="$(pacman -Quq | tr '\n' ' ')" + ;; + paru) + paru -Syyy + FAKE_CMD="paru --noconfirm -Su" + FAKE_PACKAGES="$(paru -Quq | tr '\n' ' ')" + ;; + esac + + + + #--------[ Run Command ]--------# + if [ "$FAKE_PACKAGES" ]; then + _fake_layout_message "Update" "$FAKE_CMD" "update" "$FAKE_PACKAGES" + _fake_manager_package_automation "$FAKE_CMD" + else + _fake_layout_message "Update" "$FAKE_CMD" "update" "No package updates available..." + fi + + + + #--------[ Update Other Non-Managed Software ]--------# + if [ "$(command -v pihole)" ]; then + pihole -up + fi + + + + echo "" +} diff --git a/src/fake-os/modules/manager/system/fake_manager_system_disable.sh b/src/fake-os/modules/manager/system/fake_manager_system_disable.sh new file mode 100755 index 0000000..0137265 --- /dev/null +++ b/src/fake-os/modules/manager/system/fake_manager_system_disable.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env sh + + + +#--------[ Disable Default System Daemons ]--------# +_fake_manager_system_disable () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify system daemon(s)..." + + + + #--------[ Parse System Daemons ]--------# + else + TMP_DAEMONS=$(echo "$@" | sed -e 's/^disable\ //g') + + + + #--------[ Print Command information ]--------# + _fake_layout_message "Disable Default Init Deamon(s)" "$TMP_DAEMONS" + + + + #--------[ Loop Through Daemons ]--------# + for TMP_DAEMON in $TMP_DAEMONS; do + case $ENV_INIT in + "systemd") sudo systemctl disable $TMP_DAEMON ;; + "openrc") sudo rc-update del $TMP_DAEMON ;; + esac + done + + + + fi +} diff --git a/src/fake-os/modules/manager/system/fake_manager_system_enable.sh b/src/fake-os/modules/manager/system/fake_manager_system_enable.sh new file mode 100755 index 0000000..883a95e --- /dev/null +++ b/src/fake-os/modules/manager/system/fake_manager_system_enable.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env sh + + + +#--------[ Enable Default System Daemons ]--------# +_fake_manager_system_enable () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify system daemon(s)..." + + + + #--------[ Parse System Daemons ]--------# + else + TMP_DAEMONS=$(echo "$@" | sed -e 's/^enable\ //g') + + + + #--------[ Print Command information ]--------# + _fake_layout_message "Enable Default Init Deamon(s)" "$TMP_DAEMONS" + + + + #--------[ Loop Through Daemons ]--------# + for TMP_DAEMON in $TMP_DAEMONS; do + case $ENV_INIT in + "systemd") sudo systemctl enable $TMP_DAEMON ;; + "openrc") sudo rc-update add $TMP_DAEMON ;; + esac + done + + + + fi +} diff --git a/src/fake-os/modules/manager/system/fake_manager_system_restart.sh b/src/fake-os/modules/manager/system/fake_manager_system_restart.sh new file mode 100755 index 0000000..0eff478 --- /dev/null +++ b/src/fake-os/modules/manager/system/fake_manager_system_restart.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env sh + + + +#--------[ Restart System Daemons ]--------# +_fake_manager_system_restart () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify system daemon(s)..." + + + + #--------[ Parse System Daemons ]--------# + else + TMP_DAEMONS=$(echo "$@" | sed -e 's/^restart\ //g') + + + + #--------[ Print Command information ]--------# + _fake_layout_message "Restart System Deamon(s)" "$TMP_DAEMONS" + + + + #--------[ Run Restart ]--------# + _fake_manager_system_stop "$@" + _fake_manager_system_start "$@" + echo "" + + + fi +} diff --git a/src/fake-os/modules/manager/system/fake_manager_system_start.sh b/src/fake-os/modules/manager/system/fake_manager_system_start.sh new file mode 100755 index 0000000..aa276dd --- /dev/null +++ b/src/fake-os/modules/manager/system/fake_manager_system_start.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env sh + + + +#--------[ Start System Daemons ]--------# +_fake_manager_system_start () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify system daemon(s)..." + + + + #--------[ Parse System Daemons ]--------# + else + TMP_DAEMONS=$(echo "$@") + TMP_DAEMONS=$(echo "$TMP_DAEMONS" | sed -e 's/^start\ //g') + TMP_DAEMONS=$(echo "$TMP_DAEMONS" | sed -e 's/^restart\ //g') + + + + #--------[ Print Command information ]--------# + if [ "$1" == "start" ]; then _fake_layout_message "Start Deamon(s)" "$TMP_DAEMONS"; fi + + + + #--------[ Loop Through Daemons ]--------# + for TMP_DAEMON in $TMP_DAEMONS; do + case $ENV_INIT in + "systemd") sudo systemctl start $TMP_DAEMON ;; + "openrc") sudo rc-service $TMP_DAEMON start ;; + esac + done + if [ "$1" == "start" ]; then echo ""; fi + + + + fi +} diff --git a/src/fake-os/modules/manager/system/fake_manager_system_status.sh b/src/fake-os/modules/manager/system/fake_manager_system_status.sh new file mode 100755 index 0000000..07c7596 --- /dev/null +++ b/src/fake-os/modules/manager/system/fake_manager_system_status.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env sh + + + +#--------[ Start System Daemons ]--------# +_fake_manager_system_status () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify system daemon(s)..." + echo "" + + + + #--------[ Parse System Daemons ]--------# + else + TMP_DAEMONS=$(echo "$@") + TMP_DAEMONS=$(echo "$TMP_DAEMONS" | sed -e 's/^status\ //g') + + + + #--------[ Print Command information ]--------# + + + + #--------[ Loop Through Daemons ]--------# + for TMP_DAEMON in $TMP_DAEMONS; do + _fake_layout_message "Daemon Status" "$TMP_DAEMON" + case $ENV_INIT in + "systemd") systemctl status $TMP_DAEMON ;; + "openrc") rc-service $TMP_DAEMON status ;; + esac + echo "" + done + + + + fi +} diff --git a/src/fake-os/modules/manager/system/fake_manager_system_stop.sh b/src/fake-os/modules/manager/system/fake_manager_system_stop.sh new file mode 100755 index 0000000..077f852 --- /dev/null +++ b/src/fake-os/modules/manager/system/fake_manager_system_stop.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env sh + + + +#--------[ Stop System Daemons ]--------# +_fake_manager_system_stop () { + + + + #--------[ Basic Error Handeling ]--------# + if [ ! "$2" ]; then + _fake_layout_message "Error" "Must specify system daemon(s)..." + + + + #--------[ Parse System Daemons ]--------# + else + TMP_DAEMONS=$(echo "$@") + TMP_DAEMONS=$(echo "$TMP_DAEMONS" | sed -e 's/^stop\ //g') + TMP_DAEMONS=$(echo "$TMP_DAEMONS" | sed -e 's/^restart\ //g') + + + + #--------[ Print Command information ]--------# + if [ "$1" == "stop" ]; then _fake_layout_message "Stop System Deamon(s)" "$TMP_DAEMONS"; fi + + + + #--------[ Loop Through Daemons ]--------# + for TMP_DAEMON in $TMP_DAEMONS; do + case $ENV_INIT in + "systemd") sudo systemctl stop $TMP_DAEMON ;; + "openrc") sudo rc-service $TMP_DAEMON stop ;; + esac + done + if [ "$1" == "stop" ]; then echo ""; fi + + + + fi +} diff --git a/src/fake-os/modules/utils/alias/fake_alias_ls.sh b/src/fake-os/modules/utils/alias/fake_alias_ls.sh new file mode 100755 index 0000000..f7d3684 --- /dev/null +++ b/src/fake-os/modules/utils/alias/fake_alias_ls.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh + + + +#--------[ LS Alias ]--------# +if [ ! "$(command -v busybox)" ]; then + alias ls='ls --color=auto' # Colorise LS + alias ll="ls -alh" # LL functionality + alias ip="ip -c" # Colorise IP +fi diff --git a/src/fake-os/modules/utils/config/fake_utils_config_add.sh b/src/fake-os/modules/utils/config/fake_utils_config_add.sh new file mode 100755 index 0000000..13a2cb1 --- /dev/null +++ b/src/fake-os/modules/utils/config/fake_utils_config_add.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh + + + +# $1 - New FAKE//OS config file +# $2 - System config file location + + + +#--------[ Add To Config File ]--------# +_fake_utils_config_add () { + + + + #--------[ Bakup Original Config ]--------# + _fake_utils_config_backup ${2} + + + + #--------[ Message Output ]--------# + _fake_layout_message "Append Config" "${2}" "new" "${1}" "cat" "${2}.original + ${2}.fake > ${2}" + + + + #--------[ Append Config ]--------# + mkdir -p $(dirname $2) + cp -r "${1}" "${2}.fake" + cat "${2}.original" > "${2}" + cat "${2}.fake" >> "${2}" + echo "" + + + + #--------[ Debugging ]--------# + if [ "$FAKE_MODE_SLOW" ]; then sleep 3; fi +} diff --git a/src/fake-os/modules/utils/config/fake_utils_config_backup.sh b/src/fake-os/modules/utils/config/fake_utils_config_backup.sh new file mode 100755 index 0000000..a81ab9d --- /dev/null +++ b/src/fake-os/modules/utils/config/fake_utils_config_backup.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env sh + + + +# $1 - System config file location + + + +#--------[ Backup Config File ]-------- +_fake_utils_config_backup () { + if [ -f "${1}" ] && [ ! -f "${1}.original" ]; then + cp -rv "${1}" "${1}.original" + fi +} diff --git a/src/fake-os/modules/utils/config/fake_utils_config_pull.sh b/src/fake-os/modules/utils/config/fake_utils_config_pull.sh new file mode 100755 index 0000000..8bfcce7 --- /dev/null +++ b/src/fake-os/modules/utils/config/fake_utils_config_pull.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env sh + + + +# $1 - New FAKE//OS config file +# $2 - System config file location + + + +#--------[ Pull Remote Config Files ]--------# +_fake_utils_config_pull () { + + + + #--------[ Git Clone ]--------# + if [ "$(echo $1 | grep 'git')" ]; then + rm -rf $2 + mkdir -p $2 + git clone --depth 1 $1 $2 + _fake_layout_message "Git Pull" "$1 -> $2" "output" "$(ls $2 | tr '\n' ' ')" + + + + #--------[ Curl Tar.Gz Pull ]--------# + elif [ "$(echo $1 | grep 'tar.gz')" ]; then + if [ ! "$(curl -Is $1 | grep '200 OK')" ]; then + _fake_layout_message "Error" "Remote file missing..." "missing" "$1" + else + mkdir -p $2 + curl $1 | tar xzf - -C $2/ + _fake_layout_message "Curl Pull" "$1 -> $2" "output" "$(ls $2 | tr '\n' ' ')" + fi + fi + + + + #--------[ Debugging ]--------# + if [ "$FAKE_MODE_SLOW" ]; then sleep 3; fi +} diff --git a/src/fake-os/modules/utils/config/fake_utils_config_regex.sh b/src/fake-os/modules/utils/config/fake_utils_config_regex.sh new file mode 100644 index 0000000..8c621a9 --- /dev/null +++ b/src/fake-os/modules/utils/config/fake_utils_config_regex.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env sh + + + +# $1 - Search String +# $2 - Replace String +# $3 - System config file location + + + +#--------[ Regex Find/Replace Config File ]--------# +_fake_utils_config_regex () { + + + + #--------[ Backup Original Config ]--------# + _fake_utils_config_backup ${3} + + + + #--------[ Message Output ]--------# + _fake_layout_message "Regex Find and Repalce" "${3}" "search" "${1}" "replace" "${2}" + + + + #--------[ Parse and Clean Variables ]--------# + TMP_SEARCH="$1" + TMP_SEARCH="$(echo $TMP_SEARCH | sed 's/\//\\\//g' )" + TMP_SEARCH="$(echo $TMP_SEARCH | sed 's/\%/\\\%/g' )" + + TMP_REPLACE="$2" + TMP_REPLACE="$(echo $TMP_REPLACE | sed 's/\//\\\//g' )" + TMP_REPLACE="$(echo $TMP_REPLACE | sed 's/\%/\\\%/g' )" + + TMP_PATH="$3" + + + + #--------[ Regex Find/Replace Config ]--------# + sed -i "s/$TMP_SEARCH/$TMP_REPLACE/g" $TMP_PATH + echo "" + + + + #--------[ Debugging ]--------# + if [ "$FAKE_MODE_SLOW" ]; then sleep 3; fi +} diff --git a/src/fake-os/modules/utils/config/fake_utils_config_replace.sh b/src/fake-os/modules/utils/config/fake_utils_config_replace.sh new file mode 100755 index 0000000..784b26c --- /dev/null +++ b/src/fake-os/modules/utils/config/fake_utils_config_replace.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env sh + + + +# $1 - New FAKE//OS config file +# $2 - System config file location + + + +#--------[ Replace Config File ]--------# +_fake_utils_config_replace () { + + + + #--------[ Backup Original Config ]--------# + _fake_utils_config_backup ${2} + + + + #--------[ Message Output ]--------# + _fake_layout_message "Replace Config" "${2}" "new" "${1}" + + + + #--------[ Replace Config ]--------# + mkdir -p $(dirname $2) + cp -rv "${1}" "${2}.fake" + cp -rv "${1}" "${2}" + echo "" + + + + #--------[ Debugging ]--------# + if [ "$FAKE_MODE_SLOW" ]; then sleep 3; fi +} diff --git a/src/fake-os/modules/utils/config/fake_utils_config_restore.sh b/src/fake-os/modules/utils/config/fake_utils_config_restore.sh new file mode 100755 index 0000000..5ecf77c --- /dev/null +++ b/src/fake-os/modules/utils/config/fake_utils_config_restore.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env sh + + + +# $1 - New FAKE//OS config file +# $2 - System config file location + + + +#--------[ Restore Config File ]-------- +_fake_utils_config_restore () { + if [ -f "${1}.original" ]; then + cp -r "${1}" "${1}.original" + if [ $? == 0 ]; then + _fake_layout_message "Restore Config" "${1}" "backup" "${1}.original" + cp -rv "${1}.original" "${1}" + fi + else + _fake_layout_message "Error" "No backup avaiable" "missing" "${1}.original" + fi +} diff --git a/src/fake-os/modules/utils/environment/fake_environment_print.sh b/src/fake-os/modules/utils/environment/fake_environment_print.sh new file mode 100755 index 0000000..f1d6a60 --- /dev/null +++ b/src/fake-os/modules/utils/environment/fake_environment_print.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env sh + + + +#--------[ Print Environment Variables ]--------# +_fake_environment_print () { + echo "" + echo "$ENV_DISTRO [$ENV_INIT] $ENV_MANAGER" + echo "-------------------------------------" + echo "$ENV_MAKE $ENV_MODEL" + echo "" + if [ "$FAKE_MODE_DEBUG" ]; then echo "MODE_DEBUG"; fi + if [ "$FAKE_MODE_FAST" ]; then echo "MODE_FAST"; fi + if [ "$FAKE_MODE_SLOW" ]; then echo "MODE_SLOW"; fi + echo "" + if [ "$ENV_VIRTUAL" == "LXC" ]; then + echo "cpu: $ENV_CPU $ENV_ARCH $ENV_VTAG" + elif [ "$ENV_VIRTUAL" == "VM" ]; then + echo "cpu: $ENV_CPU $ENV_ARCH $ENV_VTAG" + else + echo "cpu: $ENV_CPU $ENV_ARCH" + fi + echo "mem: $ENV_MEMORY" + echo "gpu: $ENV_GPU" + echo "net: $ENV_NETWORK" +} diff --git a/src/fake-os/modules/utils/gnome/fake_utils_gnome_extensions.sh b/src/fake-os/modules/utils/gnome/fake_utils_gnome_extensions.sh new file mode 100755 index 0000000..ecc605e --- /dev/null +++ b/src/fake-os/modules/utils/gnome/fake_utils_gnome_extensions.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env sh + + + +#--------[ Gnome Extensions ]--------# +_fake_utils_gnome_extensions () { + echo " - enable [$1]" + if [ "$(_fake_utils_linux_status gdm | grep started)" ]; then + gnome-extensions enable "$1" + else + dbus-launch --exit-with-session gnome-extensions enable "$1" + fi +} diff --git a/src/fake-os/modules/utils/gnome/fake_utils_gnome_settings.sh b/src/fake-os/modules/utils/gnome/fake_utils_gnome_settings.sh new file mode 100755 index 0000000..b131709 --- /dev/null +++ b/src/fake-os/modules/utils/gnome/fake_utils_gnome_settings.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env sh + + + +#--------[ Gnome Settings ]--------# +_fake_utils_gnome_settings () { + if [ "$(_fake_utils_linux_status gdm | grep started)" ]; then + if [ "$3" ]; then + gsettings set "$1" "$2" "$3" + echo " - set [$2] $3" + else + echo "Graphical" + fi + else + if [ "$3" ]; then + dbus-launch --exit-with-session gsettings set "$1" "$2" "$3" + echo " - set [$2] $3" + else + echo "Terminal" + fi + fi +} diff --git a/src/fake-os/modules/utils/linux/fake_utils_linux_appdata.sh b/src/fake-os/modules/utils/linux/fake_utils_linux_appdata.sh new file mode 100755 index 0000000..562cbda --- /dev/null +++ b/src/fake-os/modules/utils/linux/fake_utils_linux_appdata.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env sh + + + +#--------[ Cache Clear ]--------# +_fake_utils_linux_appdata () { + if [ ! -L $1 ]; then + _fake_layout_message "Move and link" "$1 -> /data/$2" + mv -v $1 /data/$2 + ln -sfv /data/$2 $1 + echo "" + else + _fake_layout_message "$1" "Symlink already exists..." + fi +} diff --git a/src/fake-os/modules/utils/linux/fake_utils_linux_flushcache.sh b/src/fake-os/modules/utils/linux/fake_utils_linux_flushcache.sh new file mode 100755 index 0000000..3771245 --- /dev/null +++ b/src/fake-os/modules/utils/linux/fake_utils_linux_flushcache.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env sh + + + +#--------[ Cache Clear ]--------# +_fake_utils_linux_flushcache () { + + + + #--------[ Flush System Cache In Memory ]--------# + TMP_MEM_PRE=$(free -h | grep 'Mem:' | awk '{ print $4}') + echo "" + sudo -u root $ENV_SHELL -c "sync; echo 3 > /proc/sys/vm/drop_caches" + TMP_MEM_POST=$(free -h | grep 'Mem:' | awk '{ print $4}') + _fake_layout_message "Clear Cache" "echo 3 > /proc/sys/vm/drop_caches" "free memory" "$TMP_MEM_PRE -> $TMP_MEM_POST" + + + + #--------[ Flush DNS Cache ]--------# + if [ "$(command -v systemctl)" ]; then + sudo systemd-resolve --flush-caches + sudo resolvectl flush-caches + elif [ "$(command -v ndsmasq)" ]; then + sudo killall -HUP dnsmasq + fi +} diff --git a/src/fake-os/modules/utils/linux/fake_utils_linux_shellstrap.sh b/src/fake-os/modules/utils/linux/fake_utils_linux_shellstrap.sh new file mode 100755 index 0000000..93ce80a --- /dev/null +++ b/src/fake-os/modules/utils/linux/fake_utils_linux_shellstrap.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env sh + + + +# $1 - System user +# $2 - Command + + + +#--------[ Bootstrap User Shell ]--------# +_fake_utils_linux_shellstrap () { + + sudo -u "$1" $ENV_SHELL -c ". /usr/share/fake-os/fake_init.sh --quiet && $2" + +} diff --git a/src/fake-os/modules/utils/linux/fake_utils_linux_status.sh b/src/fake-os/modules/utils/linux/fake_utils_linux_status.sh new file mode 100755 index 0000000..15b2771 --- /dev/null +++ b/src/fake-os/modules/utils/linux/fake_utils_linux_status.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env sh + + + +# $1 - Init System Daemon + + + +#--------[ Cache Clear ]--------# +_fake_utils_linux_status () { + + + + #--------[ Get SystemD Data ]--------# + if [ "$ENV_INIT" == "systemd" ]; then + TMP_ENABLED="$(systemctl status $1 | grep -e 'Loaded' | grep -e 'enabled;')" + TMP_STARTED="$(systemctl status $1 | grep -e 'Active' | grep -e 'running')" + + + + #--------[ Get OpenRC Data ]--------# + elif [ "$ENV_INIT" == "openrc" ]; then + TMP_ENABLED="$(rc-update -a | grep gdm | grep -e 'boot' -e 'default' -e 'sysinit')" + TMP_STARTED="$(rc-service $1 status | grep started)" + fi + + + + #--------[ Output Data ]--------# + if [ "$TMP_ENABLED" ] && [ "$TMP_STARTED" ]; then echo "enabled started"; fi + if [ ! "$TMP_ENABLED" ] && [ "$TMP_STARTED" ]; then echo "disabled started"; fi + if [ "$TMP_ENABLED" ] && [ ! "$TMP_STARTED" ]; then echo "enabled stopped"; fi + if [ ! "$TMP_ENABLED" ] && [ ! "$TMP_STARTED" ]; then echo "disabled stopped"; fi +}