From 9ebb62f13ec1253816bbfe893efd92bde80e7dcb Mon Sep 17 00:00:00 2001 From: sld-admin Date: Wed, 26 Aug 2026 16:19:38 +0100 Subject: [PATCH] Added upgrade features, cat, multi-selector, new-menu --- README.md | 554 +++----------- installer/03_bashboard.sh | 311 ++++---- installer/brc-script-install.sh | 188 ++++- installer/scripts-needed/brc-script.sh | 957 +++++++++++++++++-------- 4 files changed, 1109 insertions(+), 901 deletions(-) diff --git a/README.md b/README.md index 73338ca..b706634 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,14 @@ Instead of placing everything directly inside `.bashrc`, this project lets you s The project includes: -- an installer -- a command-line management tool -- a modular directory layout -- default ready-to-use scripts -- a reusable colored echo utility +- an automated intelligent installer with OS detection and automatic migration +- a command-line management tool (`brc-script`) +- a modular directory layout (`scripts-available`, `scripts-enabled`, `scripts-needed`, `scripts-removed`) +- default ready-to-use scripts (Git highlights, multi-distro bashboard with Cockpit auto-detection, aliases) +- a reusable colored echo utility (`ccecho`) +- Gitea update and self-upgrade mechanism -This makes it easier to add, remove, enable, disable, and maintain shell customizations without turning `.bashrc` into a long and messy file. +This makes it easier to add, remove, enable, disable, preview, and maintain shell customizations without turning `.bashrc` into a long and messy file. --- @@ -24,44 +25,40 @@ This makes it easier to add, remove, enable, disable, and maintain shell customi - **Modular setup** Keep `.bashrc` organized by loading only the scripts you need. -- **Script management** - Create, enable, disable, remove, and modify scripts from a single command interface. +- **Intelligent Installer & Migration** + Automatically migrates your pre-existing `.bashrc` into `00_default.sh` and enables it, cleans `.bashrc` to only contain the loader, and installs required tools (`jq`, `curl`) matching your Linux distribution. -- **Automatic directory structure** - The installer creates all required folders for a modular Bash environment. +- **Multi-Script Management** + Enable or disable multiple scripts in a single command using numerical IDs or script names (e.g. `brc-script -d 1 5 12 10` or `brc-script -e 01_git-cli-highlitgh 03_bashboard`). -- **Default scripts included** - Three scripts are installed by default so users can start immediately. +- **Quick Script Preview (`cat`)** + Inspect script content and line numbers directly from the terminal with `brc-script -p ` without opening text editors. -- **Easy integration** - The project integrates with an existing Bash setup without requiring a full rewrite. +- **Cockpit Auto-Detection** + `03_bashboard.sh` automatically detects if Cockpit is installed and running, discovers its listening port dynamically (from `/etc/cockpit/cockpit.conf`, systemd sockets, or 9090), and shows the direct URL. + +- **Gitea Updates & Upgrades** + Check for project updates directly from Gitea with `brc-script --update` and upgrade core and standard scripts safely with `brc-script --upgrade` without touching your personal customizations. - **Reusable utility functions** Includes `ccecho`, a colored echo helper for cleaner terminal output. -- **Clean startup behavior** - Only required scripts are loaded at shell startup, keeping startup logic predictable. - --- ## How It Works -The system adds a small loader block to your `.bashrc`. +The installer backs up your existing `.bashrc`, migrates its content into `~/.bashrc.d/scripts-available/00_default.sh`, enables it, and replaces `.bashrc` with a minimal loader block. + That block sources scripts from the modular directories: - `scripts-needed/` - Essential scripts required for the system to work. - + Essential logic scripts required for the system to work (`brc-script.sh`, `ccecho.sh`). - `scripts-enabled/` - Scripts that should be loaded at shell startup. - + Scripts that should be loaded at shell startup (symlinks to `scripts-available/`). - `scripts-available/` - Scripts that are present but not automatically loaded. - + Scripts that are installed and ready to be enabled or customized. - `scripts-removed/` - Scripts that were removed and stored as backups. - -The idea is simple: keep `.bashrc` minimal, and move all additional Bash logic into dedicated modular files. + Scripts that were removed and stored as timestamped backups. --- @@ -71,216 +68,28 @@ After installation, the system uses the following layout: ```text ~/.bashrc.d/ +├── .version ├── scripts-needed/ │ ├── brc-script.sh │ └── ccecho.sh ├── scripts-available/ │ ├── 00_default.sh │ ├── 01_git-cli-highlitgh.sh -│ └── 02_bashboard.sh +│ ├── 02_git-cli-highlitgh-root.sh +│ ├── 03_bashboard.sh +│ └── 04_aliases.sh ├── scripts-enabled/ +│ └── 00_default.sh -> ~/.bashrc.d/scripts-available/00_default.sh └── scripts-removed/ ``` -### Folder Purpose - -#### `scripts-needed/` -Contains the core scripts required by the project itself. These are loaded automatically and should not normally be disabled. - -#### `scripts-available/` -Contains scripts that are installed and ready to be enabled. They are available for use but are not necessarily loaded at shell startup. - -#### `scripts-enabled/` -Contains the scripts that are actively enabled and sourced when Bash starts. - -#### `scripts-removed/` -Stores removed scripts as backups, usually with timestamps, so they can be restored later if needed. - ---- - -## Default Scripts Included - -The installer now copies three scripts into `scripts-available/` by default. - -These scripts are included to provide immediate value and to demonstrate how the modular system can be used in practice. - ---- - -### `00_default.sh` – Modular Bashrc Introduction and Migration Helper - -This script is intended as a starting point for users who are moving from a traditional `.bashrc` file to a modular Bash setup. - -It explains the philosophy of the project and reminds the user that the modular loader block has already been added to `.bashrc`. - -#### Main purpose - -- show a welcome message -- explain the modular system -- remind the user how to keep `.bashrc` clean -- provide a safe place to move old custom Bash configuration - -#### What to put in this script - -You can move the following content from your old `.bashrc` into `00_default.sh`: - -- aliases -- functions -- exports -- prompt customizations -- shell variables -- other custom Bash logic that you want loaded automatically - -#### Recommended workflow - -1. Open your `.bashrc` -2. Copy your personal customizations from the old file -3. Paste them into: - -```bash -~/.bashrc.d/scripts-available/00_default.sh -``` - -4. Enable the script using: - -```bash -brc-script -e -``` - -#### Important note - -Do **not** remove the modular loader block from `.bashrc`. -That block is required so Bash can load the modular scripts at startup. - -#### Typical content of `.bashrc` - -Your `.bashrc` should stay lightweight and contain mainly the modular loader block plus any absolutely necessary minimal settings. - -A typical loader block looks like this: - -```bash -# Modular Bashrc -mkdir -p ~/.bashrc.d/scripts-needed -mkdir -p ~/.bashrc.d/scripts-enabled -mkdir -p ~/.bashrc.d/scripts-available - -if [ -d ~/.bashrc.d ]; then - for needed in ~/.bashrc.d/scripts-needed/*.sh; do - [ -r "$needed" ] && source "$needed" - done - unset needed - - for file in ~/.bashrc.d/scripts-enabled/*.sh; do - [ -r "$file" ] && source "$file" - done - unset file -fi -``` - -This keeps your shell configuration clean and maintainable. - ---- - -### `01_git-cli-highlitgh.sh` – Git-Aware Prompt Enhancement - -This script improves the Bash prompt by showing useful Git repository information directly in the terminal. - -It is especially useful for developers who frequently work inside Git repositories and want an immediate visual overview of the repository state. - -#### What it does - -The script defines a `parse_git_branch()` function that detects whether the current directory is inside a Git repository. If it is, it builds a status summary for the prompt. - -#### Information shown in the prompt - -- current branch name -- staged changes -- modified files -- untracked files -- remote ahead/behind status - -#### Visual behavior - -The script uses color-coded output to help distinguish repository states: - -- **green** for a clean repository -- **purple** when there are uncommitted changes -- **cyan** for ahead/behind indicators -- additional colors for staged, modified, and untracked changes - -#### Example prompt - -```text -user@host:~/repo(main ↑1 +2 M:1 N:3)$ -``` - -#### Notes - -This script is useful for: - -- developers -- DevOps users -- anyone working with Git directly in the terminal - ---- - -### `02_bashboard.sh` – Lightweight System Dashboard - -This script displays a compact system dashboard directly in the terminal. - -It is intended to give a quick overview of the machine without opening additional tools. - -#### What it shows - -- Linux distribution information -- hostname -- local IP addresses -- public IP address -- CPU usage -- RAM usage -- disk usage -- uptime -- load average -- available updates -- temperature, if available - -#### Extra features - -- Uses a cache directory in `/tmp` to avoid repeated network calls -- Avoids expensive update checks too frequently -- Can hide temperature information if the machine is a virtual machine -- Works best on Debian-based systems - -#### Dependencies - -This script requires: - -- `curl` -- `lm-sensors` - -You can install them with: - -```bash -apt update && apt install curl lm-sensors -``` - -#### Practical use cases - -This script is useful for: - -- system administration -- quick health checks -- monitoring a remote box in a terminal -- showing a terminal dashboard at login or on demand - --- ## Installation -The project can be installed using the included installer script. - ### Automated Installation -1. Clone the repository: +1. Clone the repository from the official Gitea server: ```bash git clone https://gitea.sld-server.org/sld-admin/Modular-Bashrc-Manager @@ -294,271 +103,128 @@ chmod +x brc-script-install.sh ./brc-script-install.sh ``` -### What the installer does +### What the installer does: +- Detects the Linux distribution (`apt`, `dnf`, `yum`, `pacman`, `zypper`, `apk`, `brew`) and automatically installs `jq` and `curl` if missing. +- Creates timestamped backup of your current `.bashrc`. +- Automatically copies your existing `.bashrc` content into `~/.bashrc.d/scripts-available/00_default.sh` and enables it. +- Writes the clean modular loader block to `.bashrc`. +- Copies core scripts to `scripts-needed/` and default scripts to `scripts-available/`. +- Initializes the `.version` file for future update tracking. -The installer will: - -- detect or ask which user should receive the installation -- create the modular directory structure -- back up the existing `.bashrc` -- append the required loader block to `.bashrc` -- copy the project files into `~/.bashrc.d/` -- copy the three default scripts into `scripts-available/` -- reload the shell configuration - -3. Reload `.bashrc` if needed: +3. Reload `.bashrc`: ```bash source ~/.bashrc +# or run: refresh-brc ``` --- -### Manual Installation +## Usage (`brc-script`) -If you prefer to install the project manually, you can do it step by step. +The main command-line management tool is `brc-script`. -#### 1. Create the directory structure +### Available Commands -```bash -mkdir -p ~/.bashrc.d/scripts-needed -mkdir -p ~/.bashrc.d/scripts-enabled -mkdir -p ~/.bashrc.d/scripts-available -mkdir -p ~/.bashrc.d/scripts-removed -``` - -#### 2. Copy the core scripts into `scripts-needed/` - -```bash -cp brc-script.sh ccecho.sh ~/.bashrc.d/scripts-needed/ -chmod 750 ~/.bashrc.d/scripts-needed/brc-script.sh ~/.bashrc.d/scripts-needed/ccecho.sh -``` - -#### 3. Add the modular loader block to `.bashrc` - -Append this block to the end of your `.bashrc` file: - -```bash -# Modular Bashrc -mkdir -p ~/.bashrc.d/scripts-needed -mkdir -p ~/.bashrc.d/scripts-enabled -mkdir -p ~/.bashrc.d/scripts-available - -if [ -d ~/.bashrc.d ]; then - for needed in ~/.bashrc.d/scripts-needed/*.sh; do - [ -r "$needed" ] && source "$needed" - done - unset needed - - for file in ~/.bashrc.d/scripts-enabled/*.sh; do - [ -r "$file" ] && source "$file" - done - unset file -fi -``` - -#### 4. Copy the default scripts into `scripts-available/` - -```bash -cp 00_default.sh 01_git-cli-highlitgh.sh 02_bashboard.sh ~/.bashrc.d/scripts-available/ -ln -s ~/.bashrc.d/scripts-available/00_default.sh ~/.bashrc.d/scripts-enabled/00_default.sh -ln -s ~/.bashrc.d/scripts-available/01_git-cli-highlitgh.sh ~/.bashrc.d/scripts-enabled/01_git-cli-highlitgh.sh -ln -s ~/.bashrc.d/scripts-available/02_bashboard.sh ~/.bashrc.d/scripts-enabled/02_bashboard.sh -``` - -#### 5. Reload the shell - -```bash -source ~/.bashrc -``` +| Command | Alias / Flags | Description | +| :--- | :--- | :--- | +| **List Scripts** | `brc-script -l` / `--list` | Lists all available scripts and indicates active/enabled status (`-`). | +| **Preview / Cat Script** | `brc-script -p` / `--cat ` | Prints script source code with line numbers and status without opening an editor. | +| **Enable Script(s)** | `brc-script -e` / `--enable ` | Enables one or multiple scripts by numeric ID or name. | +| **Disable Script(s)** | `brc-script -d` / `--disable ` | Disables one or multiple scripts by numeric ID or name. | +| **Enable All** | `brc-script -ea` / `--enable-all` | Enables all available scripts. | +| **Disable All** | `brc-script -da` / `--disable-all` | Disables all currently enabled scripts. | +| **Create Script** | `brc-script -c` / `--create` | Prompts for a name, generates a template, and opens it in your editor. | +| **Modify Script** | `brc-script -m` / `--modify ` | Opens a script in editor and allows renaming. | +| **Remove Script** | `brc-script -r` / `--remove ` | Moves script(s) to `scripts-removed/` with a timestamp. | +| **Check Updates** | `brc-script -u` / `--update` | Queries Gitea repository for latest commits and new updates. | +| **Upgrade System** | `brc-script --upgrade` | Upgrades core and default scripts from Gitea (never touches `00_default.sh`). | +| **Reload Shell** | `refresh-brc` | Reloads `.bashrc` in current session. | --- -## Usage - -The main management tool is `brc-script.sh`. - -It can be used to manage scripts stored in the modular directories. - -### Common commands - -- `brc-script -c` - Create a new script in `scripts-available/` - -- `brc-script -m` - Modify an existing script - -- `brc-script -l` - List all available and enabled scripts - -- `brc-script -e` - Enable a script from `scripts-available/` - -- `brc-script -d` - Disable an enabled script - -- `brc-script -r` - Remove a script and store it in `scripts-removed/` - -### Example usage +### Command Examples +#### 1. Listing scripts ```bash -brc-script -c brc-script -l -brc-script -e -brc-script -d -brc-script -r +``` + +#### 2. Enabling multiple scripts at once (by ID or Name) +```bash +# Enable by multiple IDs +brc-script -e 1 3 4 + +# Enable by script names (with or without .sh) +brc-script -e 01_git-cli-highlitgh 03_bashboard +``` + +#### 3. Disabling multiple scripts at once +```bash +# Disable multiple IDs +brc-script -d 1 5 12 10 + +# Disable by name +brc-script -d 03_bashboard 04_aliases +``` + +#### 4. Quick viewing / catting script contents +```bash +# Preview by name +brc-script -p 03_bashboard + +# Preview by numerical ID +brc-script --cat 2 +``` + +#### 5. Checking and applying Gitea updates +```bash +# Check if new versions or commits are available +brc-script --update + +# Perform safe self-upgrade from Gitea +brc-script --upgrade ``` --- -## How to Use `00_default.sh` Correctly +## Included Default Scripts -`00_default.sh` is the ideal place to move your personal Bash customizations. +### `00_default.sh` – Personal Configuration & Migration +Contains all your original aliases, functions, and environment variables migrated during installation. This file is yours and is never overwritten during upgrades. -### Move here from your old `.bashrc` +### `01_git-cli-highlitgh.sh` & `02_git-cli-highlitgh-root.sh` – Git Prompt +Shows branch name, uncommitted changes, staged files, untracked files, and ahead/behind remote indicators directly in your prompt. -You can place inside `00_default.sh`: +### `03_bashboard.sh` – Terminal System Dashboard +Displays CPU, RAM, disk usage, IP addresses, distro info, uptime, available packages updates, and automatically discovers **Cockpit Web UI** if installed (with dynamic port detection). -- alias definitions -- functions -- environment variables -- exports -- shell helpers -- custom startup commands - -### Keep out of `.bashrc` - -The following should stay out of the main `.bashrc` file as much as possible: - -- large alias blocks -- long function definitions -- extra startup logic -- custom prompts -- project-specific utilities - -### Recommended structure - -Your `.bashrc` should contain: - -- the modular loader block -- only the minimum required shell settings - -Everything else should live in modular scripts such as `00_default.sh`. - -This approach makes your shell configuration: - -- easier to read -- easier to debug -- easier to backup -- easier to share between machines +### `04_aliases.sh` – Common Aliases +Useful starting aliases such as `alias ls="ls --color"`. --- -## Extra Utilities +## Extra Utilities: `ccecho` -### `ccecho` – Colored Echo for Better Terminal Output - -The project includes a reusable utility script called `ccecho.sh`, located in `scripts-needed/`. - -It defines a `ccecho` function for printing styled and colored text to the terminal. - -#### Example usage +The project includes `ccecho.sh` in `scripts-needed/` for formatted and colored terminal output. ```bash ccecho -t green -b black -s bold "Success!" ccecho -t red -s underline "Error!" -ccecho "Normal message without styling" ``` -#### Available text colors - -- `black` -- `red` -- `green` -- `yellow` -- `blue` -- `magenta` -- `cyan` -- `white` -- `bblack` -- `bred` -- `bgreen` -- `byellow` -- `bblue` -- `bmagenta` -- `bcyan` -- `bwhite` - -#### Background colors - -The same color names can be used with `-b`. - -#### Styles - -- `bold` -- `dim` -- `italic` -- `underline` -- `blink` -- `reverse` -- `hidden` -- `strike` - -#### Make `ccecho` available in other sessions - -If you want to use `ccecho` in other terminal sessions or scripts, source it from `.bashrc`: - -```bash -source ~/.bashrc.d/scripts-needed/ccecho.sh -``` +**Text colors:** `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`, `bblack`, `bred`, `bgreen`, `byellow`, `bblue`, `bmagenta`, `bcyan`, `bwhite`. +**Styles:** `bold`, `dim`, `italic`, `underline`, `blink`, `reverse`, `hidden`, `strike`. --- -## Why Use This System? +## Official Repository & Updates -Managing a large `.bashrc` file can quickly become difficult, especially when multiple aliases, functions, and startup commands are added over time. - -This system solves that problem by separating your Bash configuration into small, focused files. - -### Benefits - -- **Organization** - Keep your shell configuration structured and easier to understand. - -- **Maintainability** - Update one script without editing a huge `.bashrc` file. - -- **Safety** - Removed scripts are backed up in `scripts-removed/`. - -- **Flexibility** - Enable or disable features without rewriting your shell setup. - -- **Reusability** - Share modular scripts across systems more easily. - ---- - -## Contributing - -Contributions are welcome. - -If you find bugs, edge cases, or improvements, feel free to open an issue or submit a pull request. - -Possible improvements include: - -- support for more shells -- richer installer feedback -- logging and debug mode -- better script validation -- package-based installation +- **Gitea:** [https://gitea.sld-server.org/sld-admin/Modular-Bashrc-Manager](https://gitea.sld-server.org/sld-admin/Modular-Bashrc-Manager) +- **Author:** Simone Cusano ([https://sld-server.org](https://sld-server.org)) --- ## License This project is licensed under the GNU General Public License v3.0. - -For more information, see the [GPL v3 license](https://www.gnu.org/licenses/gpl-3.0.html). - diff --git a/installer/03_bashboard.sh b/installer/03_bashboard.sh index 72f5a93..25882cf 100644 --- a/installer/03_bashboard.sh +++ b/installer/03_bashboard.sh @@ -1,168 +1,204 @@ +#!/bin/bash + ############# DEPENDENCIES ############# - -# - Debian Based OS (for now) # - curl -# - lm-sensors -# apt update && apt install curl lm-sensors - +# - lm-sensors (optional for temp) +# - jq (optional) ############################################ colorize() { - local value=$1 - local green_limit=$2 - local yellow_limit=$3 + local value=$1 + local green_limit=$2 + local yellow_limit=$3 - if [ "$value" -lt "$green_limit" ]; then - echo -e "${GREEN}${value}${NC}" - elif [ "$value" -lt "$yellow_limit" ]; then - echo -e "${YELLOW}${value}${NC}" - else - echo -e "${RED}${value}${NC}" - fi + if [ "$value" -lt "$green_limit" ]; then + echo -e "${GREEN}${value}${NC}" + elif [ "$value" -lt "$yellow_limit" ]; then + echo -e "${YELLOW}${value}${NC}" + else + echo -e "${RED}${value}${NC}" + fi } function dashboard_fast() { - #### CHANGABLE OPTIONS #### - ISTHISVM=0 # Change to 1 if this is a VM. This will remove the temperature bit. - MIN_CHECK_IP=30 # Change this value to set the timing cache for checking the public IP. - MIN_CHECK_UPDATE=120 # Change this value to set the timing cache for checking updates. - LOCAL_CACHE=1 # Change this value to 1 if you want to create the local cache in the ~/.bashrc.d/.dashboard_cache. - UI_SHOWS=1 # Change to 1 if cockpit has been installed. This will shows the IP and port Link. + #### CHANGABLE OPTIONS #### + ISTHISVM=0 # Change to 1 if this is a VM. This will remove the temperature bit. + MIN_CHECK_IP=30 # Timing cache (minutes) for checking the public IP. + MIN_CHECK_UPDATE=120 # Timing cache (minutes) for checking updates. + LOCAL_CACHE=1 # 1: ~/.bashrc.d/.dashboard_cache, 0: /tmp/.dashboard_cache + #### Colors #### + GREEN="\e[32m" + YELLOW="\e[33m" + RED="\e[31m" + CYAN="\e[36m" + BOLD="\e[1m" + NC="\e[0m" # reset + #### Cache #### + if [ $LOCAL_CACHE -ne 1 ]; then + CACHE_DIR="/tmp/.dashboard_cache" + else + CACHE_DIR="${HOME}/.bashrc.d/.dashboard_cache" + fi + mkdir -p "$CACHE_DIR" 2>/dev/null + #### Overview #### + echo -e "${CYAN}========================================${NC}" + echo -e "${BOLD} 🖥️ SYSTEM OVERVIEW${NC}" + echo -e "${CYAN}========================================${NC}" - #### Colors #### - GREEN="\e[32m" - YELLOW="\e[33m" - RED="\e[31m" - CYAN="\e[36m" - BOLD="\e[1m" - NC="\e[0m" # reset - - - #### Cache #### - if [ $LOCAL_CACHE -ne 1 ]; then - CACHE_DIR="/tmp/.dashboard_cache" - else - CACHE_DIR="/home/$(whoami)/.bashrc.d/.dashboard_cache" - fi - mkdir -p "$CACHE_DIR" - - #### Overview #### - echo -e "${CYAN}========================================${NC}" - echo -e "${BOLD} 🖥️ SYSTEM OVERVIEW${NC}" - echo -e "${CYAN}========================================${NC}" - - #### OS Informations Include #### + #### OS Informations Include #### + if [ -f /etc/os-release ]; then + # shellcheck disable=SC1091 source /etc/os-release - - - #### OS info ### - echo -e "${CYAN}DISTRO:${NC} $PRETTY_NAME" + echo -e "${CYAN}DISTRO:${NC} ${PRETTY_NAME:-$ID}" echo -e "${CYAN}ID:${NC} $ID" - echo -e "${CYAN}VERSION:${NC} $VERSION" - echo -e "${CYAN}URL:${NC} $HOME_URL" - echo -e "${CYAN}BUGS_URL:${NC} $BUG_REPORT_URL" + [ -n "$VERSION" ] && echo -e "${CYAN}VERSION:${NC} $VERSION" + [ -n "$HOME_URL" ] && echo -e "${CYAN}URL:${NC} $HOME_URL" + [ -n "$BUG_REPORT_URL" ] && echo -e "${CYAN}BUGS_URL:${NC} $BUG_REPORT_URL" echo -e "${CYAN}========================================${NC}" + fi + + #### Hostname #### + echo "📛 $(hostname)" + + #### Local IP #### + LOCAL_IPS=$(hostname -I 2>/dev/null | xargs) + PRIMARY_IP=$(echo "$LOCAL_IPS" | awk '{print $1}') + + if [ -z "$LOCAL_IPS" ]; then + echo "🏠 Local IP: NOT AVAILABLE (no network?)" + else + echo "🏠 Local IP: $LOCAL_IPS" + fi + + #### Cockpit Web UI Auto-Detection #### + COCKPIT_DETECTED=0 + COCKPIT_PORT="" + + # Check if cockpit is installed or socket/service exists + if command -v cockpit-ws >/dev/null 2>&1 || command -v cockpit-bridge >/dev/null 2>&1 || [ -d /etc/cockpit ] || systemctl list-unit-files 2>/dev/null | grep -q "cockpit.socket"; then + COCKPIT_DETECTED=1 - #### Hostname #### - echo "📛 $(hostname)" - - - #### Local IP #### - LOCAL_IPS=$(hostname -I 2>/dev/null | xargs) - PRIMARY_IP=$(echo "$LOCAL_IPS" | awk '{print $1}') - - if [ -z "$LOCAL_IPS" ]; then - echo "🏠 Local IP: NOT AVAILABLE (no network?)" - if [ $UI_SHOWS -eq 1 ]; then echo "🌐 Web UI: NOT AVAILABLE"; fi - else - echo "🏠 Local IP: $LOCAL_IPS" - if [ $UI_SHOWS -eq 1 ]; then echo "🌐 Web UI: http://$PRIMARY_IP:9090"; fi + # 1. Search port in /etc/cockpit/cockpit.conf + if [ -f /etc/cockpit/cockpit.conf ]; then + COCKPIT_PORT=$(grep -Ei '^\s*(Port|Listen)\s*=' /etc/cockpit/cockpit.conf 2>/dev/null | head -n1 | awk -F= '{print $2}' | tr -d ' ') fi - - #### Public IP #### - if [ -f "$CACHE_DIR/public_ip" ] && find "$CACHE_DIR/public_ip" -mmin -$MIN_CHECK_IP | grep -q .; then - PUBLIC_IP=$(cat "$CACHE_DIR/public_ip") - else - PUBLIC_IP=$(timeout 2 curl -s ifconfig.me 2>/dev/null) - if [ -n "$PUBLIC_IP" ]; then - echo "$PUBLIC_IP" > "$CACHE_DIR/public_ip" - fi + # 2. Search port in systemd socket definition + if [ -z "$COCKPIT_PORT" ] && command -v systemctl >/dev/null 2>&1; then + COCKPIT_PORT=$(systemctl cat cockpit.socket 2>/dev/null | grep -E '^ListenStream=' | head -n1 | awk -F= '{print $2}' | tr -d ' ') fi - if [ -z "$PUBLIC_IP" ]; then - echo "🌍 Public IP: NOT AVAILABLE (no internet?)" - else - echo "🌍 Public IP: $PUBLIC_IP" + # 3. Search port in listening sockets + if [ -z "$COCKPIT_PORT" ] && command -v ss >/dev/null 2>&1; then + COCKPIT_PORT=$(ss -tlnp 2>/dev/null | grep -E 'cockpit|cockpit-ws' | awk '{print $4}' | awk -F: '{print $NF}' | head -n1) fi - #echo "" - echo -e "${CYAN} .................................. ${NC}" - #### Cpu #### + # 4. Default fallback port for Cockpit is 9090 + if [ -z "$COCKPIT_PORT" ]; then + COCKPIT_PORT=9090 + fi + fi + + if [ $COCKPIT_DETECTED -eq 1 ] && [ -n "$PRIMARY_IP" ]; then + echo -e "🌐 Cockpit UI: ${GREEN}https://${PRIMARY_IP}:${COCKPIT_PORT}${NC}" + fi + + #### Public IP #### + if [ -f "$CACHE_DIR/public_ip" ] && find "$CACHE_DIR/public_ip" -mmin -$MIN_CHECK_IP | grep -q . 2>/dev/null; then + PUBLIC_IP=$(cat "$CACHE_DIR/public_ip" 2>/dev/null) + else + PUBLIC_IP=$(timeout 2 curl -s ifconfig.me 2>/dev/null) + if [ -n "$PUBLIC_IP" ]; then + echo "$PUBLIC_IP" > "$CACHE_DIR/public_ip" 2>/dev/null + fi + fi + + if [ -z "$PUBLIC_IP" ]; then + echo "🌍 Public IP: NOT AVAILABLE (no internet?)" + else + echo "🌍 Public IP: $PUBLIC_IP" + fi + echo -e "${CYAN} .................................. ${NC}" + + #### Cpu #### + if [ -r /proc/loadavg ]; then LOAD=$(awk '{print $1}' /proc/loadavg) - CPU_PCT=$(awk -v l="$LOAD" -v n="$(nproc)" 'BEGIN {printf "%d", (l*100/n)}') + CPU_PCT=$(awk -v l="$LOAD" -v n="$(nproc 2>/dev/null || echo 1)" 'BEGIN {printf "%d", (l*100/n)}') CPU_COLOR=$(colorize "$CPU_PCT" 50 80) echo -e "🧠 CPU: ${CPU_COLOR}%" + fi - - #### Ram #### - read MEM_TOTAL MEM_USED <<< $(free -m | awk '/Mem:/ {print $2, $3}') - MEM_PCT=$((MEM_USED * 100 / MEM_TOTAL)) - MEM_COLOR=$(colorize "$MEM_PCT" 50 80) - echo -e "💾 RAM: ${MEM_COLOR}% (${MEM_USED}/${MEM_TOTAL}MB)" - - - - #### Diskspace #### - DISK_PCT=$(df / | awk 'NR==2 {gsub("%",""); print $5}') - DISK_COLOR=$(colorize "$DISK_PCT" 50 80) - DISK=$(df -h / | awk 'NR==2 {print $3 "/" $2}') - echo -e "📦 Disk: ${DISK} (${DISK_COLOR}%)" - - - - #### Uptime #### - echo "⏱️ Uptime: $(awk '{printf "%dd %dh %dm", $1/86400, ($1%86400)/3600, ($1%3600)/60}' /proc/uptime)" - - - #### Load Avarage #### - echo "📊 Load avg: $(awk '{print $1, $2, $3}' /proc/loadavg)" - - - - #### Updates #### - if command -v apt >/dev/null 2>&1; then - if [ -f "$CACHE_DIR/updates" ] && find "$CACHE_DIR/updates" -mmin -$MIN_CHECK_UPDATE | grep -q .; then - UPDATES=$(cat "$CACHE_DIR/updates") - else - UPDATES=$(apt list --upgradable 2>/dev/null | wc -l) - UPDATES=$((UPDATES - 1)) - echo "$UPDATES" > "$CACHE_DIR/updates" - fi - - ## 🎨 Dinamic Color ## - if [ "$UPDATES" -eq 0 ]; then - UPD_COLOR="${GREEN}${UPDATES}${NC}" - elif [ "$UPDATES" -le 20 ]; then - UPD_COLOR="${YELLOW}${UPDATES}${NC}" - else - UPD_COLOR="${RED}${UPDATES}${NC}" - fi - - echo -e "📦 Updates: $UPD_COLOR" - else - echo "📦 Updates: N/A" + #### Ram #### + if command -v free >/dev/null 2>&1; then + read -r MEM_TOTAL MEM_USED <<< "$(free -m | awk '/Mem:/ {print $2, $3}')" + if [ -n "$MEM_TOTAL" ] && [ "$MEM_TOTAL" -gt 0 ]; then + MEM_PCT=$((MEM_USED * 100 / MEM_TOTAL)) + MEM_COLOR=$(colorize "$MEM_PCT" 50 80) + echo -e "💾 RAM: ${MEM_COLOR}% (${MEM_USED}/${MEM_TOTAL}MB)" fi + fi + #### Diskspace #### + if command -v df >/dev/null 2>&1; then + DISK_PCT=$(df / 2>/dev/null | awk 'NR==2 {gsub("%",""); print $5}') + DISK_COLOR=$(colorize "${DISK_PCT:-0}" 50 80) + DISK=$(df -h / 2>/dev/null | awk 'NR==2 {print $3 "/" $2}') + echo -e "📦 Disk: ${DISK} (${DISK_COLOR}%)" + fi + #### Uptime #### + if [ -r /proc/uptime ]; then + echo "⏱️ Uptime: $(awk '{printf "%dd %dh %dm", $1/86400, ($1%86400)/3600, ($1%3600)/60}' /proc/uptime)" + fi - #### Temperature #### - if [ $ISTHISVM -ne 1 ]; then - if [ -f /sys/class/thermal/thermal_zone0/temp ]; then - TEMP_RAW=$(cat /sys/class/thermal/thermal_zone0/temp) + #### Load Average #### + if [ -r /proc/loadavg ]; then + echo "📊 Load avg: $(awk '{print $1, $2, $3}' /proc/loadavg)" + fi + + #### Updates (Cross-Distro) #### + if [ -f "$CACHE_DIR/updates" ] && find "$CACHE_DIR/updates" -mmin -$MIN_CHECK_UPDATE | grep -q . 2>/dev/null; then + UPDATES=$(cat "$CACHE_DIR/updates" 2>/dev/null) + else + UPDATES=0 + if command -v apt >/dev/null 2>&1; then + UPDATES=$(apt list --upgradable 2>/dev/null | grep -c "upgradable from" 2>/dev/null || true) + elif command -v dnf >/dev/null 2>&1; then + UPDATES=$(dnf check-update -q 2>/dev/null | grep -E '\.(x86_64|noarch|aarch64|i686)' | wc -l) + elif command -v pacman >/dev/null 2>&1; then + UPDATES=$(checkupdates 2>/dev/null | wc -l || pacman -Qu 2>/dev/null | wc -l) + elif command -v zypper >/dev/null 2>&1; then + UPDATES=$(zypper list-updates 2>/dev/null | grep -c '^v ' || true) + elif command -v apk >/dev/null 2>&1; then + UPDATES=$(apk version -l '<' 2>/dev/null | wc -l) + else + UPDATES="N/A" + fi + echo "$UPDATES" > "$CACHE_DIR/updates" 2>/dev/null + fi + + ## Dynamic Color for Updates ## + if [[ "$UPDATES" =~ ^[0-9]+$ ]]; then + if [ "$UPDATES" -eq 0 ]; then + UPD_COLOR="${GREEN}${UPDATES}${NC}" + elif [ "$UPDATES" -le 20 ]; then + UPD_COLOR="${YELLOW}${UPDATES}${NC}" + else + UPD_COLOR="${RED}${UPDATES}${NC}" + fi + echo -e "📦 Updates: $UPD_COLOR" + else + echo "📦 Updates: N/A" + fi + + #### Temperature #### + if [ $ISTHISVM -ne 1 ]; then + if [ -f /sys/class/thermal/thermal_zone0/temp ]; then + TEMP_RAW=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null) + if [ -n "$TEMP_RAW" ]; then TEMP=$((TEMP_RAW/1000)) if [ "$TEMP" -lt 50 ]; then @@ -176,12 +212,11 @@ function dashboard_fast() { echo -e "🌡️ Temp: $TEMP_COLOR" fi fi + fi - echo -e "${CYAN}========================================${NC}" + echo -e "${CYAN}========================================${NC}" } - - if [[ $- == *i* ]]; then - dashboard_fast + dashboard_fast fi diff --git a/installer/brc-script-install.sh b/installer/brc-script-install.sh index 5276095..1c793a9 100755 --- a/installer/brc-script-install.sh +++ b/installer/brc-script-install.sh @@ -8,11 +8,75 @@ pause() { read -rp "Press Enter to continue..." } -debmess(){ - $debdescription="$1" - echo "DEBUG MESSAGE: $debdescription" - echo "Press enter to continue..." - read debmess +# ======================== +# OS & DEPENDENCIES +# ======================== +install_dependencies() { + echo "=============================================" + echo "[ Checking and installing dependencies... ]" + echo "=============================================" + + local need_jq=0 + local need_curl=0 + + if ! command -v jq >/dev/null 2>&1; then + need_jq=1 + fi + if ! command -v curl >/dev/null 2>&1; then + need_curl=1 + fi + + if [[ $need_jq -eq 0 && $need_curl -eq 0 ]]; then + echo " -> Dependencies (jq, curl) are already installed." + return 0 + fi + + local sudo_cmd="" + if [[ "$EUID" -ne 0 ]] && command -v sudo >/dev/null 2>&1; then + sudo_cmd="sudo" + fi + + # Distro detection + local distro="" + if [[ -f /etc/os-release ]]; then + # shellcheck disable=SC1091 + source /etc/os-release + distro="${ID:-unknown}" + echo " -> Detected OS: ${PRETTY_NAME:-$distro}" + fi + + echo " -> Installing required packages (jq, curl)..." + + if command -v apt-get >/dev/null 2>&1; then + echo " -> Using apt package manager..." + $sudo_cmd apt-get update -qq && $sudo_cmd apt-get install -y jq curl + elif command -v dnf >/dev/null 2>&1; then + echo " -> Using dnf package manager..." + $sudo_cmd dnf install -y jq curl + elif command -v yum >/dev/null 2>&1; then + echo " -> Using yum package manager..." + $sudo_cmd yum install -y jq curl + elif command -v pacman >/dev/null 2>&1; then + echo " -> Using pacman package manager..." + $sudo_cmd pacman -Sy --noconfirm jq curl + elif command -v zypper >/dev/null 2>&1; then + echo " -> Using zypper package manager..." + $sudo_cmd zypper --non-interactive in jq curl + elif command -v apk >/dev/null 2>&1; then + echo " -> Using apk package manager..." + $sudo_cmd apk add --no-cache jq curl + elif command -v brew >/dev/null 2>&1; then + echo " -> Using Homebrew..." + brew install jq curl + else + echo " -> [WARNING] No supported package manager found. Please install 'jq' and 'curl' manually." + fi + + if command -v jq >/dev/null 2>&1; then + echo " -> [OK] jq is installed." + else + echo " -> [WARNING] jq could not be installed automatically." + fi } select_user() { @@ -31,7 +95,7 @@ select_user() { exit 1 elif [[ -d "/home/$choice" ]]; then read -rp "Confirm user '$choice'? (y/N): " confirm - if [[ "$confirm" == "y" ]]; then + if [[ "$confirm" == "y" || "$confirm" == "Y" ]]; then selected_user="$choice" return fi @@ -68,8 +132,8 @@ while true; do exit 1 ;; *) - read -rp "Confirm current user '$current_user'? (y/N): " confirm - if [[ "$confirm" == "y" ]]; then + read -rp "Confirm current user '$current_user'? (Y/n): " confirm + if [[ "$confirm" == "y" || "$confirm" == "Y" || -z "$confirm" ]]; then selected_user="$current_user" break fi @@ -79,16 +143,21 @@ while true; do clear done +# ======================== +# DEPENDENCIES CHECK +# ======================== +install_dependencies + # ======================== # VARIABLES # ======================== if [ "$selected_user" == "root" ]; then - home="/root" - bashrc="$home/.bashrc" + home="/root" + bashrc="$home/.bashrc" else - home="/home/$selected_user" - bashrc="$home/.bashrc" + home="/home/$selected_user" + bashrc="$home/.bashrc" fi mainfolder="$home/.bashrc.d" @@ -102,30 +171,62 @@ script_dir="$(cd "$(dirname "$0")" && pwd)" # ======================== # CREATE DIRECTORIES # ======================== -echo "[ Creating folders... ]" +echo "" +echo "[ Creating modular directories... ]" -#mkdir -p "$neededfolder" +mkdir -p "$neededfolder" mkdir -p "$availablefolder" mkdir -p "$enabledfolder" mkdir -p "$removedfolder" # ======================== -# BACKUP .bashrc +# BACKUP AND MIGRATE .bashrc # ======================== +backup_file="$home/bashrc-backup-$(date +%F_%H-%M-%S)" + if [[ -f "$bashrc" ]]; then - cp "$bashrc" "$home/bashrc-backup-$(date +%F)" - echo "[ Backup created ]" + cp "$bashrc" "$backup_file" + echo "[ Backup created at $backup_file ]" + + # Check if existing bashrc has meaningful content (excluding empty lines and existing modular block) + cleaned_bashrc=$(grep -v "Modular Bashrc" "$bashrc" | grep -v "scripts-needed" | grep -v "scripts-enabled" | grep -v "scripts-available" | tr -d '[:space:]') + + if [[ -n "$cleaned_bashrc" ]]; then + echo "[ Migrating existing .bashrc content into 00_default.sh... ]" + cat << 'EOF' > "$availablefolder/00_default.sh" +#!/bin/bash +# ============================================================ +# Modular Bashrc - 00_default.sh +# Migrated automatically from your pre-existing ~/.bashrc +# Add your custom exports, aliases and functions here! +# ============================================================ + +EOF + cat "$bashrc" >> "$availablefolder/00_default.sh" + echo "" >> "$availablefolder/00_default.sh" + + # Automatically enable 00_default.sh so user keeps their previous configuration active + ln -sf "$availablefolder/00_default.sh" "$enabledfolder/00_default.sh" + echo " -> [OK] 00_default.sh created and enabled in scripts-enabled/" + else + if [[ -f "$script_dir/00_default.sh" ]]; then + cp "$script_dir/00_default.sh" "$availablefolder/00_default.sh" + echo " -> Copied standard 00_default.sh template" + fi + fi else - echo "[ WARNING: .bashrc not found, creating a new one ]" - touch "$bashrc" + echo "[ WARNING: .bashrc not found, creating modular base ]" + if [[ -f "$script_dir/00_default.sh" ]]; then + cp "$script_dir/00_default.sh" "$availablefolder/00_default.sh" + fi fi # ======================== -# MODIFY .bashrc +# WRITE CLEAN .bashrc # ======================== if [[ -f "$script_dir/NEEDED-FOR-INSTALLER" ]]; then - cat "$script_dir/NEEDED-FOR-INSTALLER" >> "$bashrc" - echo "[ Updated .bashrc ]" + cat "$script_dir/NEEDED-FOR-INSTALLER" > "$bashrc" + echo "[ Updated .bashrc with clean modular loader ]" else echo "[ ERROR: NEEDED-FOR-INSTALLER missing ]" exit 1 @@ -135,20 +236,22 @@ fi # COPY NEEDED SCRIPTS # ======================== needed_to_copy="$script_dir/scripts-needed" -cp -r $needed_to_copy $mainfolder -echo "[ Main logic scripts installed ]" +if [[ -d "$needed_to_copy" ]]; then + cp -r "$needed_to_copy"/* "$neededfolder/" + chmod 750 "$neededfolder"/*.sh 2>/dev/null + echo "[ Main logic scripts installed in scripts-needed ]" +fi # ======================== # COPY DEFAULT SCRIPTS # ======================== -echo "[ Installing default scripts... ]" +echo "[ Installing default available scripts... ]" default_scripts=( - "00_default.sh" "01_git-cli-highlitgh.sh" "02_git-cli-highlitgh-root.sh" "03_bashboard.sh" - "04_aliases" + "04_aliases.sh" ) for script in "${default_scripts[@]}"; do @@ -160,19 +263,24 @@ for script in "${default_scripts[@]}"; do fi done -# ======================== -# APPLY CHANGES -# ======================== -# shellcheck disable=SC1090 -#source "$bashrc" -source ~/.bashrc -echo "[ Bashrc reloaded ]" +# Save version/commit information if inside git repo +repo_dir="$(cd "$script_dir/.." && pwd)" +if git -C "$repo_dir" rev-parse --is-inside-work-tree >/dev/null 2>&1; then + current_commit=$(git -C "$repo_dir" rev-parse HEAD 2>/dev/null) + echo "$current_commit" > "$mainfolder/.version" +else + date +%s > "$mainfolder/.version" +fi + +# Fix ownership if running as root for a normal user +if [[ "$current_user" == "root" && "$selected_user" != "root" ]]; then + chown -R "$selected_user":"$selected_user" "$mainfolder" "$bashrc" "$backup_file" 2>/dev/null +fi -pause # ======================== # FINAL MESSAGE # ======================== -clear +echo "" echo "##################################" echo " Installation Done " echo "##################################" @@ -182,8 +290,14 @@ echo " $availablefolder" echo "" echo "Use commands:" echo " brc-script -> manage scripts" +echo " brc-script -l -> list scripts" +echo " brc-script --cat -> preview a script" +echo " brc-script -e -> enable script(s)" +echo " brc-script -d -> disable script(s)" +echo " brc-script --update -> check Gitea updates" +echo " brc-script --upgrade -> upgrade scripts" echo " refresh-brc -> reload config" echo "" echo "##################################" -echo " Thanks for using this script! " +echo " Thanks for using Modular Bashrc! " echo "##################################" diff --git a/installer/scripts-needed/brc-script.sh b/installer/scripts-needed/brc-script.sh index d9e3a8f..3e50597 100755 --- a/installer/scripts-needed/brc-script.sh +++ b/installer/scripts-needed/brc-script.sh @@ -3,300 +3,657 @@ ############### ### OPTIONS ### ############### -editor="vim" +editor="${EDITOR:-vim}" ################# ### VARIABLES ### ################# home_folder="$HOME/" -available_scripts="${home_folder}.bashrc.d/scripts-available/" -enabled_scripts="${home_folder}.bashrc.d/scripts-enabled/" -needed_scripts="${home_folder}.bashrc.d/scripts-needed" -bin_folder="${home_folder}.bashrc.d/scripts-removed/" +main_folder="${home_folder}.bashrc.d" +available_scripts="${main_folder}/scripts-available/" +enabled_scripts="${main_folder}/scripts-enabled/" +needed_scripts="${main_folder}/scripts-needed/" +bin_folder="${main_folder}/scripts-removed/" bashrc="${home_folder}.bashrc" +version_file="${main_folder}/.version" +update_cache="${main_folder}/.update_cache" + +# Gitea Repository Config +GITEA_REPO_URL="https://gitea.sld-server.org/sld-admin/Modular-Bashrc-Manager" +GITEA_API_URL="https://gitea.sld-server.org/api/v1/repos/sld-admin/Modular-Bashrc-Manager" +GITEA_RAW_URL="https://gitea.sld-server.org/sld-admin/Modular-Bashrc-Manager/raw/branch/master" ################# ### FUNCTIONS ### ################# +# Load ccecho if not available +if ! command -v ccecho >/dev/null 2>&1; then + if [ -f "${needed_scripts}ccecho.sh" ]; then + # shellcheck disable=SC1090 + source "${needed_scripts}ccecho.sh" + else + # Fallback simple echo if ccecho is missing + ccecho() { + local msg="" + while [[ $# -gt 0 ]]; do + case "$1" in + -t|--text|-b|--bg|-s|--style) shift 2 2>/dev/null || true ;; + *) msg+="$1 "; shift 2>/dev/null || true ;; + esac + done + echo -e "$msg" + } + fi +fi + # Refresh Bash # refresh-brc(){ - if [ "$1" == "-dis" ]; then - echo "------------------------------------" - ccecho -t bblue "[ Bashrc Refreshed ]" - echo "You can't use the old commands from now!" - echo "------------------------------------" - elif [ "$1" == "-en" ]; then - echo "------------------------------------" - ccecho -t bblue "[ Bashrc Refreshed ]" - echo "------------------------------------" - ccecho -t bgreen -s bold "You can you the new commands from now!" - echo "------------------------------------" - else - ccecho -t bblue "[ Bashrc Refreshed ]" - fi - source "$bashrc" + if [ "$1" == "-dis" ]; then + echo "------------------------------------" + ccecho -t bblue "[ Bashrc Refreshed ]" + echo "Disabled scripts have been unloaded from current session config." + echo "------------------------------------" + elif [ "$1" == "-en" ]; then + echo "------------------------------------" + ccecho -t bblue "[ Bashrc Refreshed ]" + echo "------------------------------------" + ccecho -t bgreen -s bold "You can use the new commands from now!" + echo "------------------------------------" + else + ccecho -t bblue "[ Bashrc Refreshed ]" + fi + # shellcheck disable=SC1090 + [ -f "$bashrc" ] && source "$bashrc" } +# Resolve script token (ID number or name) to actual filename in available_scripts +resolve_script_name() { + local token="$1" + [ -z "$token" ] && return 1 -createscript() { - echo "------------------------------------" - echo " Creation New Scripts: " - echo "------------------------------------" - echo "Name of the script: " - read namenewscript - if [ -f "${available_scripts}$namenewscript" ]; then - ccecho -t byellow "Script already exists!" - else - newscriptav="${available_scripts}$namenewscript.sh" + # Check if numeric ID + if [[ "$token" =~ ^[0-9]+$ ]]; then + local idx=0 + for f in "$available_scripts"*.sh; do + [ -f "$f" ] || continue + idx=$((idx + 1)) + if [ "$idx" -eq "$token" ]; then + basename "$f" + return 0 + fi + done + return 1 + fi - ### INITIALIZZATION NEW SCRIPT ### - touch $newscriptav - echo "#!/bin/bash" >> $newscriptav - echo "" >> $newscriptav - echo "### OPTIONS ###" >> $newscriptav - echo "" >> $newscriptav - echo "" >> $newscriptav - echo "### VARIABLES ###" >> $newscriptav - echo "" >> $newscriptav - echo "" >> $newscriptav - echo "### FUNCTIONS ###" >> $newscriptav - echo "${namenewscript}() {" >> $newscriptav - echo "# Add your code here!" >> $newscriptav - echo 'echo "This is the new script"' >> $newscriptav - echo "}" >> $newscriptav - echo "" >> $newscriptav - echo "### EXECUTE ###" >> $newscriptav - echo "" >> $newscriptav - echo "" >> $newscriptav - ### END NEW SCRIPT ### + # Check direct filename match + local clean_token="${token%.sh}" + if [ -f "${available_scripts}${clean_token}.sh" ]; then + echo "${clean_token}.sh" + return 0 + fi + if [ -f "${available_scripts}${token}" ]; then + echo "${token}" + return 0 + fi - vim "$newscriptav" - if [ $? -ne 0 ]; then - echo "------------------------------------" - echo " Editor aborted!" - echo " Continue or remove $namenewscript?" - echo "------------------------------------" - echo " 1 | Continue " - echo " 2 | Abort " - echo " Def | Continue " - echo "------------------------------------" - read answer - if [ "${answer}x" = "2x" ]; then - rm "$newscriptav" - return - fi - fi - echo "------------------------------------" - echo " Script $namenewscript created!" - echo " Do you want to enable it?" - echo "------------------------------------" - echo " 1 | yes " - echo " 2 | no " - echo " Def | no " - echo "------------------------------------" - read answer - if [ "$answer" -eq 1 ]; then - ln -sf "$newscriptav" "${enabled_scripts}$namenewscript.sh" - refresh-brc -en - else - ccecho -t byellow "Script not enabled!" - fi + # Case-insensitive or partial match + for f in "$available_scripts"*.sh; do + [ -f "$f" ] || continue + local fname + fname=$(basename "$f") + local base="${fname%.sh}" + if [[ "${fname,,}" == "${token,,}" || "${base,,}" == "${clean_token,,}" ]]; then + echo "$fname" + return 0 fi + done + + return 1 } - + +# List all available scripts with index and enabled indicator listitem() { - index=0 - for i in $(ls "$available_scripts"); do - inotext=${i:0:-3} - (( index ++ )) - enabled="" - if [ -f "$enabled_scripts$i" ]; then - enabled='-' - fi - if [ "$enabled" == "-" ]; then - printf "%5d | %1s %s\n" "$index" "$( ccecho -t blue -s bold $enabled)" "$( ccecho -t green $inotext)" - else - printf "%5d | %1s %s\n" "$index" "$enabled" "$( ccecho -t yellow $inotext)" - fi - done + local index=0 + local has_scripts=0 + for f in "$available_scripts"*.sh; do + [ -f "$f" ] || continue + has_scripts=1 + local filename + filename=$(basename "$f") + local inotext="${filename%.sh}" + index=$((index + 1)) + local enabled="" + if [ -f "${enabled_scripts}${filename}" ] || [ -L "${enabled_scripts}${filename}" ]; then + enabled="-" + fi + if [ "$enabled" == "-" ]; then + printf "%5d | %1s %s\n" "$index" "$(ccecho -t blue -s bold "$enabled")" "$(ccecho -t green "$inotext")" + else + printf "%5d | %1s %s\n" "$index" "$enabled" "$(ccecho -t yellow "$inotext")" + fi + done + + if [ "$has_scripts" -eq 0 ]; then + ccecho -t byellow " (No scripts found in ${available_scripts})" + fi } +# Create a new script +createscript() { + echo "------------------------------------" + echo " Create New Script " + echo "------------------------------------" + read -rp "Name of the script (without .sh): " namenewscript + namenewscript="${namenewscript%.sh}" + + if [ -z "$namenewscript" ]; then + ccecho -t bred "Script name cannot be empty!" + return 1 + fi -managescript() { - echo "------------------------------------" - echo " Select the index: " - echo "------------------------------------" - read manageindex - index2=1 - for i in $(ls "$available_scripts"); do - if [ "$manageindex" == "$index2" ]; then - # DISABLE WITH NUMBER # - if [ "$1" == "--disable" ]; then - if [ ! -f "${enabled_scripts}$i" ]; then - ccecho -t byellow "Script not enabled!" - else - unlink "${enabled_scripts}$i" - inoext=${i:0:-3} - ccecho -t bmagenta -s bold "[ Scripts $inoext Disabled ]" - refresh-brc -dis - fi - # ENABLE WITH NUMBER # - elif [ "$1" == "--enable" ]; then - if [ -f "${enabled_scripts}$i" ]; then - ccecho -t bblue "Script already enabled!" - else - ln -sf "$available_scripts$i" "${enabled_scripts}$i" - inoext=${i:0:-3} - echo "------------------------------------" - ccecho -t bgreen -s bold "[ Scripts $inoext Enabled ]" - refresh-brc -en - fi + local newscriptav="${available_scripts}${namenewscript}.sh" - # MODIFY WITH NUMBER # - elif [ "$1" == "--modify" ]; then - if [ "$editor" == "vim" ]; then - vim "$available_scripts$i" - elif [ "$editor" == "nano" ]; then - nano "$available_scripts$i" - else - echo "------------" - echo " 1 - nano " - echo " 2 - vim " - echo " def - vim " - echo "------------" - read ched - if [ "$ched" == "1" ]; then - nano "$available_scripts$i" - else - vim "$available_scripts$i" - fi - fi - clear - echo "------------------------------------" - echo "Would you like to rename the script?" - echo "------------------------------------" - echo " 1 | yes " - echo " 2 | no " - echo " default | no " - echo "------------------------------------" - read renscr - if [ $renscr == "1" ]; then - clear - countloop=0 - while [ $countloop -lt 1 ]; do - echo "------------------------------------" - echo "Insert new name:" - read renamenow - echo "------------------------------------" - echo "Is the name correct? " - echo "------------------------------------" - echo " 1 | no " - echo " 0 | yes " - echo " default | yes " - echo "------------------------------------" - read confirm - if [ "$confirm" == "1" ]; then - countloop=0 - clear - echo "------------------------------------" - echo "Rename again the file:" - else - wasenabled=0 - if [ -f "$enabled_scripts$i" ]; then - unlink "$enabled_scripts$i" - ccecho -t byellow "[ Temporary Disabled Script ]" - wasenabled=1 - fi - mv "$available_scripts$i" "${available_scripts}$renamenow.sh" - ccecho -t blue "[ Script $i renamed to $renamenow.sh ]" - if [ "$wasenabled" -eq 1 ]; then - ln -sf "${available_scripts}$renamenow.sh" "${enabled_scripts}$renamenow.sh" - ccecho -t bgreen "[ Script Enabled Again ]" - fi - countloop=1 - fi - done - fi - refresh-brc -en - # REMOVE SCRIPT # - elif [ "$1" == "--remove" ]; then - if [ ! -d "$bin_folder" ]; then - mkdir $bin_folder - fi - if [ -f "${enabled_scripts}$i" ]; then - unlink "${enabled_scripts}$i" - ccecho -t yellow "[ Script $i unabled! ]" - fi - removed_data="$i-`date +%F`_`date +%T`" - mv "${available_scripts}$i" "${bin_folder}$removed_data" - ccecho -t bmagenta "[ Script $i removed! ] " - echo "You can find it in the folder: " - echo "'$bin_folder' " - echo "------------------------------------" - refresh-brc + if [ -f "$newscriptav" ]; then + ccecho -t byellow "Script already exists!" + else + ### INITIALIZATION NEW SCRIPT ### + cat << EOF > "$newscriptav" +#!/bin/bash + +### OPTIONS ### + +### VARIABLES ### + +### FUNCTIONS ### +${namenewscript}() { + # Add your code here! + echo "Executing ${namenewscript}" +} + +### EXECUTE ### +EOF + chmod +x "$newscriptav" + + if [ "$editor" == "nano" ]; then + nano "$newscriptav" + else + vim "$newscriptav" + fi + + if [ $? -ne 0 ]; then + echo "------------------------------------" + echo " Editor aborted!" + echo " Continue or remove $namenewscript?" + echo "------------------------------------" + echo " 1 | Continue " + echo " 2 | Abort and delete " + echo " Def | Continue " + echo "------------------------------------" + read -rp "Choice: " answer + if [ "${answer}x" = "2x" ]; then + rm -f "$newscriptav" + return + fi + fi + + echo "------------------------------------" + echo " Script $namenewscript created!" + echo " Do you want to enable it?" + echo "------------------------------------" + echo " 1 | yes " + echo " 2 | no " + echo " Def | no " + echo "------------------------------------" + read -rp "Choice: " answer + if [ "$answer" == "1" ]; then + ln -sf "$newscriptav" "${enabled_scripts}${namenewscript}.sh" + refresh-brc -en + else + ccecho -t byellow "Script saved in available scripts, but not enabled." + fi + fi +} + +# Preview / Cat a script +catscript() { + local targets=("$@") + + if [ ${#targets[@]} -eq 0 ]; then + echo "------------------------------------" + echo " Preview / Cat Script " + echo "------------------------------------" + listitem + echo "------------------------------------" + read -rp "Select script number(s) or name(s) to preview: " input_str + # shellcheck disable=SC2206 + targets=($input_str) + fi + + if [ ${#targets[@]} -eq 0 ]; then + ccecho -t byellow "No script selected." + return + fi + + for target in "${targets[@]}"; do + local resolved + resolved=$(resolve_script_name "$target") + if [ -n "$resolved" ] && [ -f "${available_scripts}${resolved}" ]; then + local full_path="${available_scripts}${resolved}" + local is_enabled="DISABLED" + if [ -f "${enabled_scripts}${resolved}" ] || [ -L "${enabled_scripts}${resolved}" ]; then + is_enabled="ENABLED" fi - break + local total_lines + total_lines=$(wc -l < "$full_path") + + echo "" + echo "================================================================================" + ccecho -t bcyan -s bold " 📄 SCRIPT: ${resolved} " + ccecho -t white " 📁 Path: ${full_path}" + if [ "$is_enabled" == "ENABLED" ]; then + ccecho -t bgreen " ⚡ Status: ENABLED" + else + ccecho -t byellow " 💤 Status: DISABLED" + fi + ccecho -t white " 📊 Lines: ${total_lines}" + echo "================================================================================" + + if command -v nl >/dev/null 2>&1; then + nl -ba -w4 -s': ' "$full_path" + else + cat -n "$full_path" + fi + + echo "================================================================================" + echo "" + else + ccecho -t bred "[ Error: Script '$target' not found in available scripts! ]" fi - ((index2++)) done } -removescript(){ - echo "------------------------------------" - echo " Remove Script " - echo "------------------------------------" - listitem - managescript --remove -} - +# Enable one or more scripts by ID or Name enablescript() { + local targets=("$@") + + if [ ${#targets[@]} -eq 0 ]; then echo "------------------------------------" echo " Enable Scripts " echo "------------------------------------" listitem - managescript --enable -} + echo "------------------------------------" + read -rp "Select script number(s) or name(s) to enable (space separated): " input_str + # shellcheck disable=SC2206 + targets=($input_str) + fi -enableallscript() { - echo "------------------------------------" - echo " Enable All Scripts " - echo "------------------------------------" - for i in $(ls "$available_scripts"); do - ln -sf "$available_scripts$i" "${enabled_scripts}$i" - inoext=${i:0:-3} - echo -n "enabled " && ccecho -t green -s underline "$inoext" - done - echo "------------------------------------" - ccecho -t bgreen -s bold "[ All available scripts enabled ]" + if [ ${#targets[@]} -eq 0 ]; then + ccecho -t byellow "No script selected." + return + fi + + local changed=0 + for target in "${targets[@]}"; do + local resolved + resolved=$(resolve_script_name "$target") + if [ -n "$resolved" ] && [ -f "${available_scripts}${resolved}" ]; then + local script_name="${resolved%.sh}" + if [ -f "${enabled_scripts}${resolved}" ] || [ -L "${enabled_scripts}${resolved}" ]; then + ccecho -t bblue "[ Script $script_name already enabled ]" + else + ln -sf "${available_scripts}${resolved}" "${enabled_scripts}${resolved}" + ccecho -t bgreen -s bold "[ Script $script_name Enabled ]" + changed=1 + fi + else + ccecho -t bred "[ Error: Script '$target' not found! ]" + fi + done + + if [ $changed -eq 1 ]; then refresh-brc -en + fi } +# Enable all scripts +enableallscript() { + echo "------------------------------------" + echo " Enable All Scripts " + echo "------------------------------------" + local count=0 + for f in "$available_scripts"*.sh; do + [ -f "$f" ] || continue + local fname + fname=$(basename "$f") + ln -sf "$f" "${enabled_scripts}${fname}" + local inoext="${fname%.sh}" + echo -n "enabled " && ccecho -t green -s underline "$inoext" + count=$((count + 1)) + done + echo "------------------------------------" + ccecho -t bgreen -s bold "[ All $count available scripts enabled ]" + refresh-brc -en +} +# Disable one or more scripts by ID or Name disablescript() { + local targets=("$@") + + if [ ${#targets[@]} -eq 0 ]; then echo "------------------------------------" echo " Disable Scripts " echo "------------------------------------" listitem - managescript --disable + echo "------------------------------------" + read -rp "Select script number(s) or name(s) to disable (space separated): " input_str + # shellcheck disable=SC2206 + targets=($input_str) + fi + + if [ ${#targets[@]} -eq 0 ]; then + ccecho -t byellow "No script selected." + return + fi + + local changed=0 + for target in "${targets[@]}"; do + local resolved + resolved=$(resolve_script_name "$target") + if [ -n "$resolved" ] && [ -f "${available_scripts}${resolved}" ]; then + local script_name="${resolved%.sh}" + if [ -f "${enabled_scripts}${resolved}" ] || [ -L "${enabled_scripts}${resolved}" ]; then + rm -f "${enabled_scripts}${resolved}" + ccecho -t bmagenta -s bold "[ Script $script_name Disabled ]" + changed=1 + else + ccecho -t byellow "[ Script $script_name is not enabled ]" + fi + else + ccecho -t bred "[ Error: Script '$target' not found! ]" + fi + done + + if [ $changed -eq 1 ]; then + refresh-brc -dis + fi } - +# Disable all scripts disableallscript() { + echo "------------------------------------" + echo " Disable All Enabled Scripts " + echo "------------------------------------" + local count=0 + for f in "$enabled_scripts"*.sh; do + [ -f "$f" ] || [ -L "$f" ] || continue + local fname + fname=$(basename "$f") + rm -f "$f" + local inoext="${fname%.sh}" + echo -n "disabled " && ccecho -t red -s underline "$inoext" + count=$((count + 1)) + done + echo "------------------------------------" + ccecho -t bmagenta -s bold "[ All $count scripts disabled ]" + refresh-brc -dis +} + +# Modify a script +managescript_modify() { + local target="$1" + if [ -z "$target" ]; then + echo "###### MODIFY SCRIPT #######" + listitem echo "------------------------------------" - echo " Disable All Enabled Scripts " + read -rp "Select index or name to modify: " target + fi + + [ -z "$target" ] && return + + local resolved + resolved=$(resolve_script_name "$target") + if [ -z "$resolved" ] || [ ! -f "${available_scripts}${resolved}" ]; then + ccecho -t bred "[ Error: Script '$target' not found! ]" + return 1 + fi + + local target_path="${available_scripts}${resolved}" + + if [ "$editor" == "nano" ]; then + nano "$target_path" + elif [ "$editor" == "vim" ]; then + vim "$target_path" + else + echo "------------" + echo " 1 - nano " + echo " 2 - vim " + echo " def - vim " + echo "------------" + read -rp "Choice: " ched + if [ "$ched" == "1" ]; then + nano "$target_path" + else + vim "$target_path" + fi + fi + + echo "------------------------------------" + echo "Would you like to rename the script?" + echo "------------------------------------" + echo " 1 | yes " + echo " 2 | no " + echo " default | no " + echo "------------------------------------" + read -rp "Choice: " renscr + if [ "$renscr" == "1" ]; then + read -rp "Insert new name (without .sh): " renamenow + renamenow="${renamenow%.sh}" + if [ -n "$renamenow" ]; then + local wasenabled=0 + if [ -f "${enabled_scripts}${resolved}" ] || [ -L "${enabled_scripts}${resolved}" ]; then + rm -f "${enabled_scripts}${resolved}" + wasenabled=1 + fi + mv "$target_path" "${available_scripts}${renamenow}.sh" + ccecho -t blue "[ Script $resolved renamed to ${renamenow}.sh ]" + if [ "$wasenabled" -eq 1 ]; then + ln -sf "${available_scripts}${renamenow}.sh" "${enabled_scripts}${renamenow}.sh" + ccecho -t bgreen "[ Script Enabled Again ]" + fi + fi + fi + refresh-brc -en +} + +# Remove one or more scripts +removescript() { + local targets=("$@") + if [ ${#targets[@]} -eq 0 ]; then echo "------------------------------------" - # Disabilita tutti gli script - for i in $(ls "$enabled_scripts"); do - unlink "${enabled_scripts}$i" - inoext=${i:0:-3} - echo -n "disabled " && ccecho -t red -s underline "$inoext" - done + echo " Remove Script " echo "------------------------------------" - ccecho -t bmagenta -s bold "[ All Scripts Disabled ]" - refresh-brc -dis + listitem + echo "------------------------------------" + read -rp "Select script number(s) or name(s) to remove (space separated): " input_str + # shellcheck disable=SC2206 + targets=($input_str) + fi + + if [ ${#targets[@]} -eq 0 ]; then + ccecho -t byellow "No script selected." + return + fi + + mkdir -p "$bin_folder" + + for target in "${targets[@]}"; do + local resolved + resolved=$(resolve_script_name "$target") + if [ -n "$resolved" ] && [ -f "${available_scripts}${resolved}" ]; then + read -rp "Are you sure you want to remove '$resolved'? (y/N): " confirm_rm + if [[ "$confirm_rm" == "y" || "$confirm_rm" == "Y" ]]; then + if [ -f "${enabled_scripts}${resolved}" ] || [ -L "${enabled_scripts}${resolved}" ]; then + rm -f "${enabled_scripts}${resolved}" + ccecho -t yellow "[ Script $resolved unlinked from enabled ]" + fi + local removed_data="${resolved}-$(date +%F_%H-%M-%S)" + mv "${available_scripts}${resolved}" "${bin_folder}${removed_data}" + ccecho -t bmagenta "[ Script $resolved moved to bin: ${bin_folder}${removed_data} ]" + else + ccecho -t byellow "Removal of $resolved aborted." + fi + else + ccecho -t bred "[ Error: Script '$target' not found! ]" + fi + done + refresh-brc +} + +# Check for updates on Gitea +check_updates() { + echo "=============================================" + ccecho -t bblue -s bold "[ Checking updates on Gitea... ]" + echo " Repository: $GITEA_REPO_URL" + echo "=============================================" + + local local_ver="unknown" + if [ -f "$version_file" ]; then + local_ver=$(cat "$version_file" | tr -d '[:space:]') + fi + + local remote_commit="" + local commit_msg="" + local commit_author="" + local commit_date="" + + # Attempt API check using curl and jq + if command -v curl >/dev/null 2>&1; then + local api_res + api_res=$(curl -s -m 5 "${GITEA_API_URL}/branches/master" 2>/dev/null || true) + if [ -n "$api_res" ] && command -v jq >/dev/null 2>&1; then + remote_commit=$(echo "$api_res" | jq -r '.commit.id // empty' 2>/dev/null || true) + commit_msg=$(echo "$api_res" | jq -r '.commit.message // empty' 2>/dev/null || true) + commit_author=$(echo "$api_res" | jq -r '.commit.author.name // empty' 2>/dev/null || true) + commit_date=$(echo "$api_res" | jq -r '.commit.timestamp // empty' 2>/dev/null || true) + fi + fi + + # Fallback to git ls-remote if API is unavailable + if [ -z "$remote_commit" ] && command -v git >/dev/null 2>&1; then + remote_commit=$(git ls-remote "${GITEA_REPO_URL}.git" HEAD 2>/dev/null | awk '{print $1}' || true) + fi + + if [ -z "$remote_commit" ]; then + ccecho -t bred "[ WARNING: Unable to connect to Gitea or fetch remote version. Check internet connection. ]" + return 1 + fi + + local short_local="${local_ver:0:8}" + local short_remote="${remote_commit:0:8}" + + echo " Local Version: $short_local" + echo " Remote Version: $short_remote" + echo "---------------------------------------------" + + if [ "$local_ver" == "$remote_commit" ]; then + ccecho -t bgreen -s bold "✔ Modular Bashrc Manager is up to date!" + rm -f "$update_cache" 2>/dev/null || true + else + ccecho -t byellow -s bold "★ Update Available!" + if [ -n "$commit_author" ]; then + echo " Author: $commit_author" + echo " Date: $commit_date" + echo " Message: $commit_msg" + fi + echo "---------------------------------------------" + ccecho -t bgreen "Run 'brc-script --upgrade' to install the latest version." + echo "1" > "$update_cache" + fi + return 0 +} + +# Perform upgrade from Gitea +upgrade_system() { + echo "=============================================" + ccecho -t bblue -s bold "[ Upgrading Modular Bashrc Manager... ]" + echo " Repository: $GITEA_REPO_URL" + echo "=============================================" + + read -rp "Are you sure you want to upgrade scripts from Gitea? (y/N): " confirm_up + if [[ "$confirm_up" != "y" && "$confirm_up" != "Y" ]]; then + echo "Upgrade aborted." + return 0 + fi + + if ! command -v curl >/dev/null 2>&1; then + ccecho -t bred "[ Error: curl is required to download updates! ]" + return 1 + fi + + local tmp_dir + tmp_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'brc_upgrade') + + echo " -> Downloading latest core files..." + + # Core scripts to upgrade in scripts-needed + local core_files=("brc-script.sh" "ccecho.sh") + for f in "${core_files[@]}"; do + curl -s -f -m 10 "${GITEA_RAW_URL}/installer/scripts-needed/${f}" -o "${tmp_dir}/${f}" || true + if [ -s "${tmp_dir}/${f}" ]; then + cp "${tmp_dir}/${f}" "${needed_scripts}${f}" + chmod 750 "${needed_scripts}${f}" + echo " [OK] Updated needed script: ${f}" + else + ccecho -t byellow " [WARN] Could not update ${f}" + fi + done + + # Default available scripts to update (excluding 00_default.sh so user config is never overwritten!) + local default_available=("01_git-cli-highlitgh.sh" "02_git-cli-highlitgh-root.sh" "03_bashboard.sh" "04_aliases.sh") + echo " -> Updating standard available scripts..." + for f in "${default_available[@]}"; do + curl -s -f -m 10 "${GITEA_RAW_URL}/installer/${f}" -o "${tmp_dir}/${f}" || true + if [ -s "${tmp_dir}/${f}" ]; then + cp "${tmp_dir}/${f}" "${available_scripts}${f}" + chmod 644 "${available_scripts}${f}" + echo " [OK] Updated available script: ${f}" + fi + done + + # Fetch and record latest commit hash + local new_commit="" + if command -v jq >/dev/null 2>&1; then + local api_res + api_res=$(curl -s -m 5 "${GITEA_API_URL}/branches/master" 2>/dev/null || true) + new_commit=$(echo "$api_res" | jq -r '.commit.id // empty' 2>/dev/null || true) + fi + if [ -z "$new_commit" ] && command -v git >/dev/null 2>&1; then + new_commit=$(git ls-remote "${GITEA_REPO_URL}.git" HEAD 2>/dev/null | awk '{print $1}' || true) + fi + if [ -n "$new_commit" ]; then + echo "$new_commit" > "$version_file" + else + date +%s > "$version_file" + fi + + rm -rf "$tmp_dir" "$update_cache" 2>/dev/null || true + + echo "---------------------------------------------" + ccecho -t bgreen -s bold "[ Upgrade completed successfully! ]" + echo "---------------------------------------------" + refresh-brc +} + +# Passive check notification +passive_check_notice() { + if [ -f "$update_cache" ]; then + ccecho -t byellow "★ [Notice] An update is available on Gitea! Run 'brc-script --upgrade'" + echo "" + fi + return 0 } ################# @@ -305,61 +662,97 @@ disableallscript() { # Main Script # brc-script() { + local cmd="" + if [ $# -gt 0 ]; then + cmd="$1" + shift + fi + + case "$cmd" in + ### PREVIEW / CAT SCRIPT ### + -p|-v|--cat|--view|--show|cat|show|view) + catscript "$@" + ;; + ### ENABLE SCRIPTS ### - if [ "$1" == "-e" ]; then - enablescript + -e|--enable|enable) + enablescript "$@" + ;; ### ENABLE ALL SCRIPTS ### - elif [ "$1" == "-ea" ]; then - enableallscript + -ea|--enable-all|enable-all) + enableallscript + ;; ### DISABLE SCRIPT ### - elif [ "$1" == "-d" ]; then - disablescript + -d|--disable|disable) + disablescript "$@" + ;; ### DISABLE ALL SCRIPTS ### - elif [ "$1" == "-da" ]; then - disableallscript + -da|--disable-all|disable-all) + disableallscript + ;; ### SCRIPTS LIST ### - elif [ "$1" == "-l" ]; then - echo "------------------------------------" - echo " Scripts List " - echo "------------------------------------" - listitem - echo "------------------------------------" - echo " The script preceded by the" - echo " '-' character is active. " - echo "------------------------------------" + -l|--list|list) + passive_check_notice + echo "------------------------------------" + echo " Scripts List " + echo "------------------------------------" + listitem + echo "------------------------------------" + echo " '-' (blue) = Active / Enabled " + echo "------------------------------------" + ;; ### MODIFY SCRIPTS ### - elif [ "$1" == "-m" ]; then - echo "###### MODIFY SCRIPTS #######" - listitem - managescript --modify + -m|--modify|modify) + managescript_modify "$1" + ;; ### CREATE NEW SCRIPT ### - elif [ "$1" == "-c" ]; then - createscript + -c|--create|create) + createscript + ;; ### REMOVE SCRIPT ### - elif [ "$1" == "-r" ]; then - removescript + -r|--remove|remove) + removescript "$@" + ;; - ### COMMAND LISTS ### - else - echo "-----------------------------" - echo " List of brc-scripts command " - echo "-----------------------------" - echo " -c | Create New Script " - echo " -m | Modify Script " - echo " -l | Scripts List " - echo " -e | Enable Scripts " - echo " -d | Disable Scripts " - echo " -da | Disable All Scripts " - echo " -ea | Enable All Scripts " - echo " -r | Remove Script " - echo "-----------------------------" - fi + ### CHECK UPDATES ### + -u|--update|update) + check_updates + ;; + + ### UPGRADE SCRIPTS ### + --upgrade|upgrade) + upgrade_system + ;; + + ### COMMAND LIST / HELP ### + *) + passive_check_notice + echo "--------------------------------------------------------" + echo " List of brc-script commands " + echo "--------------------------------------------------------" + echo " -l, --list | List all scripts " + echo " -p, --cat | Preview / Cat script(s) " + echo " -e, --enable | Enable script(s) " + echo " -d, --disable | Disable script(s) " + echo " -ea, --enable-all | Enable all scripts " + echo " -da, --disable-all | Disable all scripts " + echo " -c, --create | Create new script " + echo " -m, --modify | Edit / rename script " + echo " -r, --remove | Remove script(s) to bin " + echo " -u, --update | Check updates on Gitea " + echo " --upgrade | Upgrade scripts & core " + echo "--------------------------------------------------------" + echo " Example: brc-script -d 1 5 12 03_bashboard " + echo " Example: brc-script -e 2 4 01_git-cli-highlitgh " + echo " Example: brc-script -p 03_bashboard " + echo "--------------------------------------------------------" + ;; + esac } -