#!/bin/ash

#WORK IN PROGRESS

# Define toolkit paths
GITUSER="iamromulan"
GITREPO="quectel-rgmii-toolkit"
GITTREE="development-SDXPINN"
GITMAINTREE="SDXPINN"
GITDEVTREE="development-SDXPINN"
TMP_DIR="/tmp"
USRDATA_DIR="/data"
SIMPLE_FIREWALL_DIR="/data/simplefirewall"
SIMPLE_FIREWALL_SCRIPT="$SIMPLE_FIREWALL_DIR/simplefirewall.sh"
SIMPLE_FIREWALL_SYSTEMD_DIR="$SIMPLE_FIREWALL_DIR/systemd"

# Function to remount file system as read-write
remount_rw() {
    mount -o remount,rw /
}

# Function to remount file system as read-only
remount_ro() {
    mount -o remount,ro /
}

send_at_commands_using_atcmd() {
    while true; do
        echo -e "\e[1;32mEnter AT command (or type 'exit' to return to the main menu): \e[0m"
        read at_command
        if [ "$at_command" = "exit" ]; then
            echo -e "\e[1;32mReturning to the main menu.\e[0m"
            break
        fi
        echo -e "\e[1;32mSending AT command: $at_command\e[0m"
        echo -e "\e[1;32mResponse:\e[0m"
        # Use atcmd to send the command and display the output
        atcmd_output=$(atcmd "$at_command")
        echo "$atcmd_output"
        echo -e "\e[1;32m----------------------------------------\e[0m"
    done
}


overlay_check() {
    if ! grep -qs '/real_rootfs ' /proc/mounts; then
        echo -e "\e[31mYou have not ran Option 2 yet!!! Please run option 2!!\e[0m"
        return 1
    fi
}

basic_55x_setup() {
    # Check if neither /etc nor /real_rootfs is mounted
    if ! grep -qs '/etc ' /proc/mounts && ! grep -qs '/real_rootfs ' /proc/mounts; then
        # Echo message in red
        echo -e "\033[31mSomething is wrong or this is not an SDXPINN modem.\033[0m"
        echo -e "\033[31mI was expecting either /etc or /real_rootfs to be a mount point.\033[0m"
        exit 1
    fi

    # Check if /etc is mounted
    if grep -qs '/etc ' /proc/mounts; then
        echo "Unmounting /etc..."
        umount -lf /etc
    fi

    # Check if /real_rootfs is mounted
    if grep -qs '/real_rootfs ' /proc/mounts; then
        # Echo message in red
        echo -e "\033[31mThe environment has already been setup. If you want to undo the changes temporarily run service mount-fix stop.\033[0m"
        exit 1
    fi

    cd /etc/init.d/
    wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/init.d/mount-fix
    wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/init.d/init-overlay-watchdog
    # Set executable permissions
    chmod +x mount-fix
    chmod +x init-overlay-watchdog
    cd /usr/sbin
	wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/usr/sbin/init-overlay-watchdog.sh
	cd /
    service mount-fix enable
    service init-overlay-watchdog enable
    service mount-fix start
	echo "src/gz iamromulan-SDXPINN-repo https://raw.githubusercontent.com/iamromulan/quectel-rgmii-toolkit/SDXPINN/opkg-feed" >> /etc/opkg/customfeeds.conf
	rm /etc/opkg/distfeeds.conf
	cd /etc/opkg/
	wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/opkg/distfeeds.conf
	cd /
	wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/opkg-feed/iamromulan-SDXPINN-repo.key -O /tmp/iamromulan-SDXPINN-repo.key
    opkg-key add /tmp/iamromulan-SDXPINN-repo.key
	opkg update
	opkg install inotifywait inotifywatch
    service init-overlay-watchdog start
    echo -e "\e[92m"
    echo "Mount fix completed!"
    echo "Visit https://github.com/iamromulan for more!"
	echo "Proceeding with basic packages installation...."	
    echo -e "\e[0m"
	opkg install atinout luci-app-atinout-mod
	opkg install shadow-login
	opkg install luci-app-ttyd
	opkg install mc-skins
	rm /etc/config/atcommands.user
	rm /etc/config/atinout
	rm /etc/config/ttyd
	cd /etc/config/
	wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/atcommands.user
	wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/ttyd
	wget https://raw.githubusercontent.com/$GITUSER/$GITREPO/$GITTREE/etc/config/atinout
	cd /
	service uhttpd enable
	service dropbear enable
	service uhttpd start
	service dropbear start
	echo -e "\e[92m"
    echo "Set your root password:"
    echo -e "\e[0m"
	set_root_passwd
	echo -e "\e[92m"
    echo "Basic packages installed!"
    echo "Visit https://github.com/iamromulan for more!"
    echo -e "\e[0m"
}

ttl_setup() {
  local ttl_file="/etc/firewall.user.ttl"
  local lan_utils_script="/etc/data/lanUtils.sh"
  local combine_function="util_combine_iptable_rules"
  local temp_file="/tmp/temp_firewall_user_ttl"

  overlay_check || return

  while true; do
    if [ ! -f "$ttl_file" ]; then
      echo "Creating $ttl_file..."
      touch "$ttl_file"

      echo "Modifying $combine_function in $lan_utils_script..."

      # Backup the original script
      cp "$lan_utils_script" "${lan_utils_script}.bak"

      # Add the local ttl_firewall_file line if it's not already present
      if ! grep -q "local ttl_firewall_file" "$lan_utils_script"; then
        sed -i '/local tcpmss_firewall_filev6/a \  local ttl_firewall_file=/etc/firewall.user.ttl' "$lan_utils_script"
      fi

      # Add the condition to include the ttl_firewall_file if it's not already present
      if (! grep -q "if \[ -f \"\$ttl_firewall_file\" \]; then" "$lan_utils_script"); then
        sed -i '/if \[ -f "\$tcpmss_firewall_filev6" \]; then/i \  if [ -f "\$ttl_firewall_file" ]; then\n    cat \$ttl_firewall_file >> \$firewall_file\n  fi' "$lan_utils_script"
      fi
    fi

    if [ ! -s "$ttl_file" ]; then
      echo -e "\e[31mTTL is not enabled\e[0m"
    else
      ipv4_ttl=$(grep 'iptables -t mangle -A POSTROUTING' "$ttl_file" | awk '{for(i=1;i<=NF;i++){if($i=="--ttl-set"){print $(i+1)}}}')
      ipv6_ttl=$(grep 'ip6tables -t mangle -A POSTROUTING' "$ttl_file" | awk '{for(i=1;i<=NF;i++){if($i=="--hl-set"){print $(i+1)}}}')
      echo -e "\e[32mCurrent IPv4 TTL: $ipv4_ttl\e[0m"
      echo -e "\e[32mCurrent IPv6 TTL: $ipv6_ttl\e[0m"
    fi

    echo -e "\e[32mWould you like to edit the TTL settings?\e[0m"
    echo -e "\e[32mTTL Value will be set without needing a reboot \e[0m"
    echo -e "\e[33mType yes or exit:\e[0m" && read -r response

    if [ "$response" = "exit" ]; then
      echo "Exiting..."
      break
    elif [ "$response" = "yes" ]; then
      echo -e "\e[32mType 0 to disable TTL\e[0m"
      echo -e "\e[33mEnter the TTL value (number only):\e[0m" && read -r ttl_value
      if ! [[ "$ttl_value" =~ ^[0-9]+$ ]]; then
        echo "Invalid input, please enter a number."
      else
        # Clear existing TTL rules
        echo "Clearing existing TTL rules..."
        iptables -t mangle -D POSTROUTING -o rmnet+ -j TTL --ttl-set "$ipv4_ttl"
        ip6tables -t mangle -D POSTROUTING -o rmnet+ -j HL --hl-set "$ipv6_ttl"

        if [ "$ttl_value" -eq 0 ]; then
          echo "Disabling TTL..."
          > "$ttl_file"
        else
          echo "Setting TTL to $ttl_value..."
          echo "iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set $ttl_value" > "$ttl_file"
          echo "ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set $ttl_value" >> "$ttl_file"
          iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set $ttl_value
          ip6tables -t mangle -A POSTROUTING -o rmnet+ -j HL --hl-set $ttl_value
        fi
      fi
    fi
  done
}

set_root_passwd() {
    passwd
}

# Function for Tailscale Submenu
tailscale_menu() {
    while true; do
        echo -e "\e[1;32mTailscale Menu\e[0m"
        echo -e "\e[1;32m1) Install/Update Tailscale\e[0m"
        echo -e "\e[1;36m2) Configure Tailscale\e[0m"
        echo -e "\e[1;31m3) Return to Main Menu\e[0m"
        read -p "Enter your choice: " tailscale_choice

        case $tailscale_choice in
            1) install_update_tailscale ;;
            2) configure_tailscale ;;
            3) break ;;
            *) echo "Invalid option" ;;
        esac
    done
}

# Function to install, update, or remove Tailscale
install_update_tailscale() {
    echo -e "\e[1;31mInstalling Tailscale from opkg...\e[0m"
    opkg install tailscale
    if [ $? -ne 0 ]; then
        echo -e "\e[1;31mFailed to install Tailscale via opkg.\e[0m"
        return 1
    fi

    echo -e "\e[1;32mTailscale has been installed via opkg.\e[0m"
    echo -e "\e[1;32mUpdating to the latest Tailscale version...\e[0m"
	
	# Stop Running Service
	service tailscale stop

    # Define variables for the download
    TAILSCALE_URL="https://pkgs.tailscale.com/stable/tailscale_1.74.1_arm64.tgz"
    TAILSCALE_TGZ="/tmp/tailscale_1.74.1_arm64.tgz"
    TAILSCALE_TMP_DIR="/tmp/tailscale_update"

    # Download the latest Tailscale package
    echo -e "\e[1;32mDownloading latest Tailscale package...\e[0m"
    curl "$TAILSCALE_URL" -o "$TAILSCALE_TGZ"
    if [ $? -ne 0 ]; then
        echo -e "\e[1;31mFailed to download Tailscale package. Please check your internet connection.\e[0m"
        rm -f "$TAILSCALE_TGZ"
        return 1
    fi

    # Extract the package
    echo -e "\e[1;32mExtracting Tailscale package...\e[0m"
    mkdir -p "$TAILSCALE_TMP_DIR"
    tar -xzf "$TAILSCALE_TGZ" -C "$TAILSCALE_TMP_DIR"
    if [ $? -ne 0 ]; then
        echo -e "\e[1;31mFailed to extract Tailscale package.\e[0m"
        rm -f "$TAILSCALE_TGZ"
        rm -rf "$TAILSCALE_TMP_DIR"
        return 1
    fi

    # Replace the binaries with force option
    echo -e "\e[1;32mUpdating Tailscale binaries...\e[0m"
    cp -f "$TAILSCALE_TMP_DIR/tailscale_1.74.1_arm64/tailscale" /usr/sbin/
    cp -f "$TAILSCALE_TMP_DIR/tailscale_1.74.1_arm64/tailscaled" /usr/sbin/
    if [ $? -ne 0 ]; then
        echo -e "\e[1;31mFailed to copy new Tailscale binaries.\e[0m"
        rm -f "$TAILSCALE_TGZ"
        rm -rf "$TAILSCALE_TMP_DIR"
        return 1
    fi

    # Set the correct permissions
    chmod +x /usr/sbin/tailscale /usr/sbin/tailscaled

    # Clean up temporary files
    rm -f "$TAILSCALE_TGZ"
    rm -rf "$TAILSCALE_TMP_DIR"

    # Start Tailscale service if available
    service tailscale start
    echo -e "\e[1;32mTailscale version 1.74.1 installed\e[0m"
}


# Function to Configure Tailscale
configure_tailscale() {
    while true; do
        echo "Configure Tailscale"
        echo -e "\e[38;5;40m1) Enable Tailscale Web UI at http://192.168.225.1:8088 (Gateway on port 8088)\e[0m"  # Green
        echo -e "\e[38;5;196m2) Disable Tailscale Web UI\e[0m"  # Red
        echo -e "\e[38;5;27m3) Connect to Tailnet\e[0m"  # Brown
        echo -e "\e[38;5;87m4) Connect to Tailnet with SSH ON\e[0m"  # Light cyan
        echo -e "\e[38;5;105m5) Reconnect to Tailnet with SSH OFF\e[0m"  # Light magenta
        echo -e "\e[38;5;172m6) Disconnect from Tailnet (reconnects at reboot)\e[0m"  # Light yellow
        echo -e "\e[1;31m7) Logout from tailscale account\e[0m"
        echo -e "\e[38;5;27m8) Return to Tailscale Menu\e[0m"
        read -p "Enter your choice: " config_choice

        case $config_choice in
            1) echo -e "\e[38;5;196mNot for the 551 yet\e[0m" ;;  # Red
            2) echo -e "\e[38;5;196mNot for the 551 yet\e[0m" ;;  # Red
            3) tailscale up --accept-dns=false --reset ;;
            4) tailscale up --ssh --accept-dns=false --reset ;;
            5) tailscale up --accept-dns=false --reset ;;
            6) tailscale down ;;
            7) tailscale logout ;;
            8) break ;;
            *) echo "Invalid option" ;;
        esac
    done
}

# Main menu
while true; do
    echo "                           .%+:                              "
    echo "                             .*@@@-.                         "
    echo "                                  :@@@@-                     "
    echo "                                     @@@@#.                  "
    echo "                                      -@@@@#.                "
    echo "       :.                               %@@@@: -#            "
    echo "      .+-                                #@@@@%.+@-          "
    echo "      .#- .                               +@@@@# #@-         "
    echo "    -@*@*@%                                @@@@@::@@=        "
    echo ".+%@@@@@@@@@%=.                            =@@@@# #@@- ..    "
    echo "    .@@@@@:                                :@@@@@ =@@@..%=   "
    echo "    -::@-.+.                                @@@@@.=@@@- =@-  "
    echo "      .@-                                  .@@@@@:.@@@*  @@. "
    echo "      .%-                                  -@@@@@:=@@@@  @@# "
    echo "      .#-         .%@@@@@@#.               +@@@@@.#@@@@  @@@."
    echo "      .*-            .@@@@@@@@@@=.         @@@@@@ @@@@@  @@@:"
    echo "       :.             .%@@@@@@@@@@@%.     .@@@@@+:@@@@@  @@@-"
    echo "                        -@@@@@@@@@@@@@@@..@@@@@@.-@@@@@ .@@@-"
    echo "                         -@@@@@@@@@@%.  .@@@@@@. @@@@@+ =@@@="
    echo "                           =@@@@@@@@*  .@@@@@@. @@@@@@..@@@@-"
    echo "                            #@@@@@@@@-*@@@@@%..@@@@@@+ #@@@@-"
    echo "                            @@@@@@:.-@@@@@@.  @@@@@@= %@@@@@."
    echo "                           .@@@@. *@@@@@@- .+@@@@@@-.@@@@@@+ "
    echo "                           %@@. =@@@@@*.  +@@@@@@%.-@@@@@@%  "
    echo "                          .@@ .@@@@@=  :@@@@@@@@..@@@@@@@=   "
    echo "                          =@.+@@@@@. -@@@@@@@*.:@@@@@@@*.    "
    echo "                          %.*@@@@= .@@@@@@@-.:@@@@@@@+.      "
    echo "                          ..@@@@= .@@@@@@: #@@@@@@@:         "
    echo "                           .@@@@  +@@@@..%@@@@@+.            "
    echo "                           .@@@.  @@@@.:@@@@+.               "
    echo "                            @@@.  @@@. @@@*    .@.           "
    echo "                            :@@@  %@@..@@#.    *@            "
    echo "                         -*: .@@* :@@. @@.  -..@@            "
    echo "                       =@@@@@@.*@- :@%  @* =@:=@#            "
    echo "                      .@@@-+@@@@:%@..%- ...@%:@@:            "
    echo "                      .@@.  @@-%@:      .%@@*@@%.            "
    echo "                       :@@ :+   *@     *@@#*@@@.             "
    echo "                                     =@@@.@@@@               "
    echo "                                  .*@@@:=@@@@:               "
    echo "                                .@@@@:.@@@@@:                "
    echo "                              .@@@@#.-@@@@@.                 "
    echo "                             #@@@@: =@@@@@-                  "
    echo "                           .@@@@@..@@@@@@*                   "
    echo "                          -@@@@@. @@@@@@#.                   "
    echo "                         -@@@@@  @@@@@@%                     "
    echo "                         @@@@@. #@@@@@@.                     "
    echo "                        :@@@@# =@@@@@@%                      "
    echo "                        @@@@@: @@@@@@@:                      "
    echo "                        *@@@@  @@@@@@@.                      "
    echo "                        .@@@@  @@@@@@@                       "
    echo "                         #@@@. @@@@@@*                       "
    echo "                          @@@# @@@@@@@                       "
    echo "                           .@@+=@@@@@@.                      "
    echo "                                *@@@@@@                      "
    echo "                                 :@@@@@=                     "
    echo "                                  .@@@@@@.                   "
    echo "                                    :@@@@@*.                 "
    echo "                                      .=@@@@@-               "
    echo "                                           :+##+.            "

    echo -e "\e[92m"
    echo "Welcome to iamromulan's rcPCIe Toolkit script for Quectel RM55x Series modems!"
    echo "Visit https://github.com/iamromulan for more!"
    echo -e "\e[0m"
    echo -e "\e[91mThis is a test version of the toolkit for the new RM550/551 modems\e[0m" # Light Red
    echo "Select an option:"
    echo -e "\e[0m"
    echo -e "\e[96m1) Send AT Commands\e[0m" # Cyan
    echo -e "\e[92m2) First time setup/run me after a flash!\e[0m" # Green
    echo -e "\e[94m3) TTL Setup\e[0m" # Light Blue
    echo -e "\e[94m4) Set root password\e[0m" # Light Blue
    echo -e "\e[94m5) Tailscale Management\e[0m" # Light Blue
    echo -e "\e[92m6) Install Speedtest.net CLI app (speedtest command)\e[0m" # Light Green
    echo -e "\e[93m7) Exit\e[0m" # Yellow (repeated color for exit option)
    read -p "Enter your choice: " choice

    case $choice in
        1) send_at_commands_using_atcmd ;;
        2) remount_rw; basic_55x_setup ;;
        3) 
            overlay_check
            if [ $? -eq 1 ]; then continue; fi
            ttl_setup 
            ;;
        4) 
            overlay_check
            if [ $? -eq 1 ]; then continue; fi
            set_root_passwd 
            ;;
        5) tailscale_menu ;;
        6)
            overlay_check
            if [ $? -eq 1 ]; then continue; fi
            echo -e "\e[1;32mInstalling Speedtest.net CLI (speedtest command)\e[0m"
            cd /usr/bin
            curl -O https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-aarch64.tgz
            tar -xzf ookla-speedtest-1.2.0-linux-aarch64.tgz
            rm ookla-speedtest-1.2.0-linux-aarch64.tgz
			rm speedtest.7
            rm speedtest.md
            cd /
            echo -e "\e[1;32mSpeedtest CLI (speedtest command) installed!!\e[0m"
            echo -e "\e[1;32mTry running the command 'speedtest'\e[0m"
            echo -e "\e[1;32mNote that it will not work unless you login to the root account first\e[0m"
            echo -e "\e[1;32mNormally only an issue in adb, ttyd, and ssh you are forced to login\e[0m"
            echo -e "\e[1;32mIf in adb just type login and then try to run the speedtest command\e[0m"
            ;;
        7) echo -e "\e[1;32mGoodbye!\e[0m"; break ;;
        *) echo -e "\e[1;31mInvalid option\e[0m" ;;
    esac
done
