CHIRP-next Installer/Update-Skript

Da sich CHIRP-next nicht in dem Repository meines Betriebssystem befindet und ich keine Luste habe, immer manuell upzudaten, habe ich mir ein Shell-Skript erstellt, welches das Update in einem Rutsch erledigt. Es kann außerdem auch eine Installation von Chirp vornehmen.

Hinweis. Das Skript ist für meine Bedürfnisse unter Debian 12 angepasst. Es kann fehlerhaft sein.

Im Prinzip funktioniert es so:

  • Ist CHIRP-next nicht installiert, werden auf Wunsch die Abhängigkeiten und CHIRP-next installiert
  • Sollte CHIRP-next schon installiert sein, sucht das Skript nach einer neueren Version und installiert diese

Download

Installer CHIRP-next

Einfach folgenden Code in die Konsole eingeben.

wget https://eulenbit.net/wp-content/uploads/2025/04/installer-chirp-next.sh && chmod +x installer-chirp-next.sh && ./installer-chirp-next.sh

Alternativ kann man auch das Skript herunterladen. Danach muss es noch mit

chmod +x installer-chirp-next.sh

ausführbar und mit

./installer-chirp-next.sh

gestartet werden.

Version: 0.1
Published: 2. Mai 2025

Shell-Skript

#!/bin/bash

# CHIRP-next URL
BASE_URL="https://archive.chirpmyradio.com/chirp_next/"

clear

# --- Farben und Stile ---
NC='\033[0m'
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
BOLD='\033[1m'
UNDERLINE='\033[4m'
INVERT='\033[7m'
BOLD_GREEN='\033[1;32m'
BOLD_RED='\033[1;31m'
BLINK_RED='\033[5;31m'



# --- Einführungsbildschirm ---
echo -e "==============================================="
echo -e "${BOLD_GREEN} CHIRP-next Installer Skript${NC}"
echo -e "${GREEN} für Debian, *Ubuntu, Mint, (Fedora & Arch)${NC}"
echo -e "==============================================="
echo " Dieses Skript führt folgende Aktionen durch:"
echo "  - Prüft Systemvoraussetzungen"
echo "  - Installiert benötigte Abhängigkeiten"
echo "  - Findet die neueste CHIRP-Version"
echo "  - Führt ein Update/Installation durch"
echo ""
echo " Skript-Download und Dokumentation:"
echo ""
echo -e "  🌐 ${BOLD}https://eulenbit.net/chirp/${NC}"
echo -e "     ${BOLD}by DL5VU${NC}"
echo ""
echo -e "==============================================="
echo ""
read -p "Drücke [Enter] um fortzufahren oder [Strg+C] zum Abbrechen"

echo -e "Bitte warten ..."

# --- Distribution Detection ---
DISTRO_ID=$(grep -oP '^ID=\K\w+' /etc/os-release 2>/dev/null)
DISTRO_ID_LIKE=$(grep -oP '^ID_LIKE=\K\w+' /etc/os-release 2>/dev/null)

# --- Paketabhängigkeiten definieren ---
case $DISTRO_ID in
  "debian"|"ubuntu")
    WX_PACKAGE="python3-wxgtk4.0"
    PIPX_PACKAGE="pipx"
    PKG_MGR="apt"
    ;;
  "fedora"|"rhel")
    WX_PACKAGE="python3-wxpython4"
    PIPX_PACKAGE="pipx"
    PKG_MGR="dnf"
    ;;
  "arch")
    WX_PACKAGE="wxpython"
    PIPX_PACKAGE="python-pipx"
    PKG_MGR="pacman"
    ;;
  *)
    if [[ "$DISTRO_ID_LIKE" == *"debian"* ]]; then
      WX_PACKAGE="python3-wxgtk4.0"
      PIPX_PACKAGE="pipx"
      PKG_MGR="apt"
    else
      HIRP-neecho -e "${RED}Nicht unterstützte Distribution: ${DISTRO_ID}${NC}"
      exit 1
    fi
    ;;
esac

# --- Hilfsfunktionen ---
check_package() {
  case $PKG_MGR in
    "apt") dpkg -s "$1" &> /dev/null ;;
    "dnf") rpm -q "$1" &> /dev/null ;;
    "pacman") pacman -Qs "$1" &> /dev/null ;;
  esac
}

show_install_menu() {
  local pkg=$1
  local install_cmd=$2
  local manual_cmd=$3

  echo -e "${YELLOW}Das Paket '${pkg}' ist nicht installiert.${NC}"
  echo "1) Automatisch installieren (benötigt sudo)"
  echo "2) Installationsanleitung anzeigen und Skript beenden"
  echo "3) Skript abbrechen"
  read -p "Deine Wahl (1-3): " choice

  case $choice in
    1)
      echo -e "${GREEN}Installiere ${pkg}...${NC}"
      eval "sudo ${install_cmd}" || {
        echo -e "${RED}Installation fehlgeschlagen!${NC}"
        exit 1
      }
      ;;
    2)
      echo -e "\n${BLUE}Führen Sie folgenden Befehl aus:${NC}"
      echo -e "${manual_cmd}"
      echo -e "\nStarten Sie das Skript anschließend erneut.\n"
      exit 0
      ;;
    3)
      echo -e "${RED}Abbruch durch Benutzer${NC}"
      exit 0
      ;;
    *)
      echo -e "${RED}Ungültige Eingabe!${NC}"
      exit 1
      ;;
  esac
}

# --- wxPython Installation prüfen ---
if ! check_package "$WX_PACKAGE"; then
  case $PKG_MGR in
    "apt")
      install_cmd="apt install -y $WX_PACKAGE"
      manual_cmd="sudo apt install $WX_PACKAGE"
      ;;
    "dnf")
      install_cmd="dnf install -y $WX_PACKAGE"
      manual_cmd="sudo dnf install $WX_PACKAGE"
      ;;
    "pacman")
      install_cmd="pacman -Sy $WX_PACKAGE"
      manual_cmd="sudo pacman -Sy $WX_PACKAGE"
      ;;
  esac

  show_install_menu "$WX_PACKAGE" "$install_cmd" "$manual_cmd"
fi

# --- pipx Installation prüfen ---
if ! command -v pipx &> /dev/null; then
  echo -e "${YELLOW}pipx ist nicht installiert.${NC}"
  echo "1) Systempaket installieren (benötigt sudo)"
  echo "2) Pipx lokal installieren (ohne sudo)"
  echo "3) Installationsanleitung anzeigen"
  echo "4) Skript abbrechen"
  read -p "Ihre Wahl (1-4): " choice

  case $choice in
    1)
      case $PKG_MGR in
        "apt") cmd="apt install -y $PIPX_PACKAGE" ;;
        "dnf") cmd="dnf install -y $PIPX_PACKAGE" ;;
        "pacman") cmd="pacman -Sy $PIPX_PACKAGE" ;;
      esac

      echo -e "${GREEN}Installiere pipx...${NC}"
      eval "sudo $cmd" && python3 -m pipx ensurepath || {
        echo -e "${RED}Installation fehlgeschlagen!${NC}"
        exit 1
      }
      ;;
    2)
      echo -e "${GREEN}Lokale Installation mit pip...${NC}"
      python3 -m pip install --user pipx && python3 -m pipx ensurepath || {
        echo -e "${RED}Installation fehlgeschlagen!${NC}"
        exit 1
      }
      export PATH="$PATH:$HOME/.local/bin"
      ;;
    3)
      echo -e "\n${BLUE}Systeminstallation:${NC}"
      case $PKG_MGR in
        "apt") echo "sudo apt install $PIPX_PACKAGE" ;;
        "dnf") echo "sudo dnf install $PIPX_PACKAGE" ;;
        "pacman") echo "sudo pacman -Sy $PIPX_PACKAGE" ;;
      esac
      echo -e "\n${BLUE}Lokale Installation:${NC}"
      echo "python3 -m pip install --user pipx"
      echo "python3 -m pipx ensurepath"
      echo -e "\nStarten Sie das Skript anschließend erneut.\n"
      exit 0
      ;;
    4)
      echo -e "${RED}Abbruch durch Benutzer${NC}"
      exit 0
      ;;
    *)
      echo -e "${RED}Ungültige Eingabe!${NC}"
      exit 1
      ;;
  esac
fi

# --- Versionsprüfung für chirp ---
if pipx list | grep -q 'package chirp'; then
  if command -v jq &> /dev/null; then
    installed_version=$(pipx list --json | jq -r '.venvs.chirp.metadata.main_package.package_version // empty' 2>/dev/null)
  else
    installed_version=$(pipx runpip chirp freeze | grep -i 'chirp==' | cut -d= -f3)
  fi
else
  installed_version="0"
fi

# Ermittle neueste verfügbare Version
latest_dir=$(wget -qO- "$BASE_URL" | grep -oP 'href="next-\d{8}/"' | grep -oP '\d{8}' | sort -r | head -n1)

if [ -z "$latest_dir" ]; then
  echo -e "${RED}Keine Versionen auf dem Server gefunden.${NC}"
  exit 1
fi

# Versionsvergleich
if [ "$installed_version" -ge "$latest_dir" ]; then
  echo -e "${GREEN}Aktuelle Version bereits installiert: ${installed_version}${NC}"
  echo "Keine neuere Version verfügbar."
  exit 0
fi

# Bestätigung für Update
echo -e "${BLUE}Gefundene Versionen:${NC}"
echo " - Installiert:    ${installed_version:-nicht installiert}"
echo " - Verfügbar:     ${latest_dir}"
echo ""
read -p "Möchten Sie auf Version ${latest_dir} aktualisieren? (j/N) " -r antwort
echo ""

if [[ ! "$antwort" =~ ^[jJ] ]]; then
  echo -e "${RED}Abbruch durch Benutzer${NC}"
  exit 0
fi

# --- Deinstallation bei Update ---
if [ "$installed_version" != "0" ]; then
  echo -e "${YELLOW}Deinstalliere Version ${installed_version}...${NC}"
  pipx uninstall chirp || {
    echo -e "${RED}Deinstallation fehlgeschlagen!${NC}"
    exit 1
  }
fi

# --- Verzeichnisvorbereitung ---
dir_name=$(date +%Y%m%d)-inst-chirp
dir_path="./${dir_name}"

if [ -d "$dir_path" ]; then
  echo -e "${YELLOW}Bereinige Verzeichnis ${dir_path}...${NC}"
  rm -rf "${dir_path:?}/"*
else
  mkdir -p "$dir_path"
fi

# --- Download und Installation ---
file_name="chirp-${latest_dir}-py3-none-any.whl"
download_url="${BASE_URL}next-${latest_dir}/${file_name}"

echo -e "${BLUE}Lade ${file_name} herunter...${NC}"
wget -q --show-progress -P "$dir_path" "$download_url" || {
  echo -e "${RED}Download fehlgeschlagen${NC}"
  exit 1
}

if [ -f "${dir_path}/${file_name}" ]; then
  echo -e "${GREEN}Starte Installation...${NC}"
  pipx install --system-site-packages "${dir_path}/${file_name}" || {
    echo -e "${RED}Installation fehlgeschlagen!${NC}"
    exit 1
  }
  
  # Erfolgsmeldung
  echo -e "\n${GREEN}✅ Erfolgreich aktualisiert auf Version: ${latest_dir}${NC}"
  echo -e "Installationspfad: ${BLUE}${dir_path}/${file_name}${NC}"

  # Temporäres Verzeichnis bereinigen
  echo -e "\n${YELLOW}Bereinige temporäres Verzeichnis...${NC}"
  rm -rf "${dir_path}"
  echo -e "${GREEN}Aufräumen abgeschlossen.${NC}"

else
  echo -e "${RED}Datei nicht gefunden: ${dir_path}/${file_name}${NC}"
  exit 1
fi
Mehr anzeigen