#!/usr/bin/env bash
clear


## FEDORA BASEOS FILES
osrel="/etc/fedora-release"
######################

## COLORS
# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White
######################


## HEADER
echo -e "${On_Green}====================================================================
==== Tyleo Next Generation Script - Fedora Interactive Deployer ====
====================================================================${Color_Off}"
## HOST DETAILS
# SHOW
echo -e "${On_Green}= Host Informations${Color_Off}"
echo -e " Hostname   : ${BGreen}$HOSTNAME${Color_Off}"
echo -e " Primary IP : ${BGreen}$(hostname -I | cut -d' ' -f1)$Color_Off"
echo -e " Time       : ${BGreen}$(date)${Color_Off}"
echo -e " User       : ${BGreen}$(whoami)${Color_Off}"
echo -e " UID/GID    : ${BGreen}$UID${Color_Off}"
echo -e " HomeDir    : ${BGreen}$HOME${Color_Off}"
echo -e " Language   : ${BGreen}$LANG${Color_Off}"
echo -e "${On_Green}= ${Color_Off}"
######################

## BASE (UI)
prefix="Run      |>"
errors="Error    |>"
succes="Success  |>"
compat="Compat   |>"
askfor="Question |>"
######################

## ROOT MODE CHECK (SUDO MODE OR SU MODE)
if [ "$UID" -ne 0 ]
then
echo -e "${Red}$errors Root mode not detected (current UID : ${BRed}$UID${Red}). You must run this script as root or via sudo command. (we recommend running as root mode after sudo su -)${Color_Off}"
exit
fi
######################

if [[ -f "$osrel" ]]; then
    echo -e "${BCyan}$compat${Color_Off} Fedora was detected."
    echo -e "${BYellow}$prefix${Color_Off} Continue Execution."
else
    echo -e "${BCyan}$compat${Color_Off} Another OS is active on this machine. Incompatibility identified."
    echo -e "${BYellow}$prefix${Color_Off} Exiting."
    exit
fi

## RANDOM PIN
pincode=$(shuf -i 1000-9999 -n 1)
#######################

## CONFIRMATION
echo -n -e "${BBlue}$askfor${Color_Off} Type this code to execute ($pincode) : "
read -r pinentered
if [[ "$pinentered" -ne "$pincode" ]]
then
    echo -e "${BRed}$errors Pincode $pinentered received, there is an error here. Good Bye.${Color_Off}"
    echo -e "${BRed}$errors Exiting...${Color_Off}"
    exit
fi
echo -e "${BGreen}$succes Pincode $pinentered received, Accepted.${Color_Off}"
#######################
sleep 2
clear
echo -e "${On_Blue}== Interactive Deployment Started - Welcome $(whoami) ==${Color_Off}"

echo "defaultyes=True" >> /etc/dnf/dnf.conf
echo "color=never" >> /etc/dnf/dnf.conf

## Updating System
echo -e "${BYellow}$prefix${Color_Off} DNF:Updating Packages..."
echo -e "$BPurple"
dnf up -y --refresh
echo -e "$Color_Off"
echo -e "$Color_Off"

## Firewall Control
clear
echo -e "${On_Blue}== FirewallD Control ==${Color_Off}"
echo -n -e "${BBlue}$askfor${Color_Off} Disable Firewall-D ? (Recommended to avoid issues, can be enabled again later)(Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    systemctl stop firewalld
    systemctl disable firewalld
    echo -e "${BYellow}$prefix${Color_Off} FirewallD is now stopped and disabled."
    sleep 3
else
    echo -e "${BYellow}$prefix${Color_Off} FirewallD was ${BRed}not${Color_Off} disabled."
    sleep 3
fi
accept="n"

## BASIC PACKAGES BY TYLEO (With auto mode)
clear
echo -e "${On_Blue}== Basic Package by Tyleo Dv. Delaware - Installation Processing ==${Color_Off}"
echo -n -e "${BBlue}$askfor${Color_Off} Install Basic Package (Recommended, Include BTOP, HTOP and Glances) ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -e "${On_Blue}== htop btop duf fish zsh git nano glances  ==${Color_Off}"
    echo -e "${BYellow}$prefix${Color_Off} Installing Base Packages (recommended by Tyleo)..."
    echo -e "${BYellow}$prefix${Color_Off} DNF:Installing Packages..."
    echo -e "$BPurple"
    dnf in -y htop btop duf fish zsh git nano glances
    echo -e "$Color_Off"
    echo -e "${BYellow}$prefix${Color_Off} SYS:Enabling Glances..."
    systemctl enable glances
    systemctl start glances
fi
accept="n"

## BASIC PACKAGES BY TYLEO (With auto mode)
clear
echo -e "${On_Blue}== Additionnal Packages - Installation Processing ==${Color_Off}"
echo -n -e "${BBlue}$askfor${Color_Off} Install Additionnal Packages ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -n -e "${BBlue}$askfor${Color_Off} Packages (separated by SPACES) :"
    read -r pkgs
    echo -e "$BPurple"
    dnf up --refresh -y
    dnf in $pkgs -y
    echo -e "$Color_Off"
fi
accept="n"

## BASIC PACKAGES BY TYLEO (With auto mode)
if [[ -f /usr/bin/cockpit-bridge ]]; then
    clear
    echo -e "${On_Blue}== Cockpit Admin Panel - Installation Processing ==${Color_Off}"
    echo -n -e "${BBlue}$askfor${Color_Off} Install Cockpit [9090/https] ? (Y/n):"
    read -r accept
    if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -e "$BPurple"
    dnf up --refresh -y
    dnf in cockpit -y
    echo -e "$Color_Off"
    dnf in -y cockpit-navigator
    dnf in -y https://github.com/45Drives/cockpit-navigator/releases/download/v0.5.8/cockpit-navigator-0.5.8-1.el8.noarch.rpm
    echo -e "${Purple} [9090/https] Enabling Cockpit Services..."
    systemctl enable cockpit.socket
    systemctl enable cockpit
    echo -e "${Purple} [9090/https] Starting Cockpit Services..."
    systemctl start cockpit.socket
    systemctl start cockpit
    fi
accept="n"
fi

clear
echo -e "${On_Blue}== Basic System Configuration ==${Color_Off}"
echo -n -e "${BBlue}$askfor${Color_Off} Change Hostnames ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -n -e "${BBlue}$askfor${Color_Off} New Pretty Hostname (spaces,maj) : "
    read -r pHost
    echo -n -e "${BBlue}$askfor${Color_Off} New Static Hostname (no-space,no-maj) : "
    read -r sHost
    echo -e "${Purple} Setting Hostname (Pretty)${BGreen} [OK]${Color_Off}"
    hostnamectl set-hostname "$pHost" --pretty
    echo -e "${Purple} Setting Hostname (Static)${BGreen} [OK]${Color_Off}"
    hostnamectl set-hostname "$sHost" --static
    sleep 3
fi
accept="n"

echo -n -e "${BBlue}$askfor${Color_Off} Create a Service Account ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -n -e "${BBlue}$askfor${Color_Off} Username : "
    read username
    if [[ -f /usr/bin/fish ]]; then
        useradd $username --shell /usr/bin/fish -G wheel -m -d /home/srv-$username -c "Service Account" -b /home/srv-$username
        echo "$username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/srv-$username
        passwd $username
    else
        useradd $username --shell /usr/bin/bash -G wheel -m -d /home/srv-$username -c "Service Account" -b /home/srv-$username
        echo "$username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/srv-$username
        passwd $username
    fi
    
    sleep 3
fi
accept="n"

echo -n -e "${BBlue}$askfor${Color_Off} Change Local and SSHD MOTD (Cockpit/sshd) ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -n -e "${BBlue}$askfor${Color_Off} MOTD - Description (no-return,spaces,maj) : "
    read -r dMOTD
    echo -e "${Purple} Setting MOTD to Local motd file (/etc/motd)${BGreen} [OK]${Color_Off}"
    echo -e "$dMOTD" > /etc/motd
    echo -e "${Purple} Setting MOTD to SSHD motd file (/etc/ssh-motd)${BGreen} [OK]${Color_Off}"
    echo -e "$dMOTD" > /etc/ssh-motd
    echo -e "${Purple} Setting SSHD Configuration to SSHD .d file (/etc/ssh/sshd_config.d/999-banner)${BGreen} [OK]${Color_Off}"
    echo "Banner /etc/ssh-motd" > /etc/ssh/sshd_config.d/999-banner
    chmod 0600 /etc/ssh/sshd_config.d/999-banner
    chmod 0600 /etc/ssh-motd
    systemctl restart sshd
    sleep 3
fi
accept="n"

echo -n -e "${BBlue}$askfor${Color_Off} Change Timezone ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -n -e "${BBlue}$askfor${Color_Off} Enter the Timezone (Zone/City) : "
    read -r tzone
    timedatectl set-timezone $tzone
    echo -e "${Purple} Setting Timezone to $tzone${BGreen} [OK]${Color_Off}"
    sleep 3
fi
accept="n"

## DOCKER
clear
echo -e "${On_Blue}== Docker Community Edition - Installation Processing ==${Color_Off}"
echo -n -e "${BBlue}$askfor${Color_Off} Install Docker ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -e "${BYellow}$prefix${Color_Off} DNF-CFG:Adding Docker CE Repo (Auto Rel)..."
    dnf config-manager --add-repo=https://download.docker.com/linux/fedora/docker-ce.repo -y
    echo -e "$Color_Off"
    echo -e "${BYellow}$prefix${Color_Off} DNF:Updating Index..."
    echo -e "$BPurple"
    dnf up -y --refresh
    echo -e "$Color_Off"
    echo -e "$Color_Off"
    echo -e "${BYellow}$prefix${Color_Off} DNF:Installing docker-ce..."
    echo -e "$BPurple"
    dnf in docker-ce -y
    echo -e "$Color_Off"
    wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 -O /usr/local/bin/ctop
    chmod +x /usr/local/bin/ctop
    wget http://s.tyleodev.fr/host-binary/lazydocker -O /usr/local/bin/lzd
    chmod +x /usr/local/bin/lzd
    curl -L "https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-$(uname -s)-$(uname -m)" -o /bin/docker-compose
    chmod +x /bin/docker-compose
    echo -e "${BYellow}$prefix${Color_Off} SYS:Enabling Docker and Docker Socket..."
    systemctl enable docker.socket
    systemctl enable docker
    systemctl start docker.socket
    systemctl start docker
    sleep 3
fi
accept="n"

## XRDP (RDS Mode, not recommended for Docker enabled host)
clear
echo -e "${On_Blue}== X-Server Remote Desktop Services - Installation Processing ==${Color_Off}"
echo -n -e "${BBlue}$askfor${Color_Off} Install XRDP Server ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    dnf up -y
    echo -e "$Color_Off"
    echo -e "$BPurple"
    dnf in xrdp -y
    echo -e "$Color_Off"
    firewall-cmd --permanent --add-port=3389/tcp
    firewall-cmd --reload
    chcon --type=bin_t /usr/sbin/xrdp
    chcon --type=bin_t /usr/sbin/xrdp-sesman
    systemctl enable xrdp
    systemctl enable xrdp-sesman
    systemctl start xrdp
    systemctl start xrdp-sesman
    sleep 3
fi
accept="n"

## GOOGLE CHROME // FOR RDS OR DESKTOP ONLY
chrome_rpm="https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm"
clear
echo -e "== ${BBlue}G${BRed}o${BYellow}o${BBlue}g${BGreen}l${BRed}e${Color_Off} Chrome - Installation Processing =="
echo -n -e "${BBlue}$askfor${Color_Off} Install Google Chrome Browser ? (RDS or Desktop only !!)(Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    dnf up -y
    echo -e "$Color_Off"
    echo -e "$BPurple"
    dnf in -y $chrome_rpm
    echo -e "$Color_Off"
    sleep 3
fi

# TERMINATED
clear
echo -e "${On_Green}== Script Finished - Reboot is Recommended ==${Color_Off}"
echo -n -e "${BBlue}$askfor${Color_Off} Reboot Now ? (Y/n):"
read -r accept
if [[ $accept = Y ]] || [[ $accept = y ]] ; then
    echo -e "${BPurple}${BYellow}$prefix${Color_Off} Rebooting ...${Color_Off}"
    sleep 1
    sudo reboot
fi
accept="n"