From b46cf2175d7bc545fe4c969f2b982ed8f0cc14c6 Mon Sep 17 00:00:00 2001 From: Geoff Murphy 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. + +![demo](src/fake-os/assets/other/demo.png) + +# 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 + +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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 (IOK-PHWJYRvsff>HUz8m?t=#(YSmUOyX$U! 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 | 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 " + 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 +}