diff --git a/.backup-config/backup2ndScript.sh b/.backup-config/backup2ndScript.sh new file mode 100644 index 0000000..4159f92 --- /dev/null +++ b/.backup-config/backup2ndScript.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# -------------------------------------------------- +# Backup Skript fuer Raspberrys mit Config Dateien +# (c) Josef Spitzlberger, 03.12.2022 +# +# 2. Skript fuer Sondersituationen in denen es nicht ausreicht, Dateien anzugeben +# -------------------------------------------------- + +# -------------------------------------------------- +# Parameter uebernehmen +# -------------------------------------------------- + +BACKUP_DIR=$1 + +# -------------------------------------------------- +# als 2. Skript melden +# -------------------------------------------------- +echo "----------------------------------------------------" +echo " 2. Skript gestartet" +echo "----------------------------------------------------" + +# -------------------------------------------------- +# Sonderkommandos zum Sichern +# -------------------------------------------------- + +# -------------------------------------------------- +# MariaDB +# -------------------------------------------------- + +# Maria DB + +# +# Kommandos +MYSQL_CMD=/usr/bin/mysql +MYSQL_DMP=/usr/bin/mysqldump + +# Backup +# +echo +echo "Starte Datenbanksicherung ..." +mkdir -p "$BACKUP_DIR/MariaDB" +databases=`$MYSQL_CMD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"` + +for db in $databases; do + echo "Sichere Datenbank $db ..." + $MYSQL_DMP --no-data --databases "$db" > "$BACKUP_DIR/MariaDB/$db-schema.sql" + $MYSQL_DMP --force --opt --databases "$db" | gzip > "$BACKUP_DIR/MariaDB/$db.gz" +done + +# -------------------------------------------------- +# 2. Skript beenden +# -------------------------------------------------- +echo "----------------------------------------------------" +echo " 2. Skript abgeschlossen" +echo "----------------------------------------------------" + +exit 0 diff --git a/.backup-config/backup_dirs.txt b/.backup-config/backup_dirs.txt new file mode 100644 index 0000000..ea6a5f6 --- /dev/null +++ b/.backup-config/backup_dirs.txt @@ -0,0 +1,4 @@ +/home/pi/CaravanPi/defaults +/home/pi/MagicMirror/css/custom.css +/home/pi/MagicMirror/config/config.js +/usr/local/bin/pishutdown.py diff --git a/.backup-config/backup_name.txt b/.backup-config/backup_name.txt new file mode 100644 index 0000000..2c0cb82 --- /dev/null +++ b/.backup-config/backup_name.txt @@ -0,0 +1,4 @@ +CaravanPiSSD +15 +LGBsharepoint +Backup/Geraete/Raspberry diff --git a/.crontabs/crontab-pi b/.crontabs/crontab-pi index 9bc8945..27a2344 100644 --- a/.crontabs/crontab-pi +++ b/.crontabs/crontab-pi @@ -10,10 +10,6 @@ # min hour dayofmonth month dayofweek(0=Sonntag) command # - -# Python-Flask starten für die CaravanPi Websites -@reboot python3 -u /home/pi/CaravanPi/html-flask/flask-main.py >/home/pi/CaravanPi/.log/flask-main.log 2>&1 - # Temperatursensoren alle 60 Sekunden auslesen 00-59/10 * * * * python3 -u /home/pi/CaravanPi/temperature/temp2file.py >/home/pi/CaravanPi/.log/temp2file.log 2>&1 @@ -54,8 +50,5 @@ #@reboot python3 -u /home/pi/CaravanPi/analogSignals/v12Check.py -b "car" >/home/pi/CaravanPi/.log/v12Check.log 2>&1 @reboot python3 -u /home/pi/CaravanPi/analogSignals/v12Check.py -b "bord" >/home/pi/CaravanPi/.log/v12Check.log 2>&1 -# Webservice bottleFramework starten -#@reboot python3 -u /home/pi/CaravanPi/bottleFramework/bottleCommands.py >/home/pi/CaravanPi/.log/bottleCommands.log 2>&1 - # Zeit zwischen StromPi und Raspberry Pi synchronisieren @reboot python /home/pi/StromPi3/RTCSerial.py >/home/pi/CaravanPi/.log/StromPi-RTC-sync.log 2>&1 diff --git a/.crontabs/crontab-root b/.crontabs/crontab-root index 25ddee9..f3ad671 100644 --- a/.crontabs/crontab-root +++ b/.crontabs/crontab-root @@ -2,15 +2,8 @@ # # min hour dayofmonth month dayofweek(0=Sonntag) command # -# beim Neustart Skript fuer Sensor starten -@reboot python3 /home/pi/CaravanPi/pir/pir.py 120 1 > /home/pi/CaravanPi/.log/pir.log 2>&1 -# Backup Image starten (Sonntags) -# 01 03 * * 0 /usr/local/bin/backup.sh > /home/pi/CaravanPi/.log/backup.log 2>&1 -# 05 20 * * * /usr/local/bin/backup.sh > /home/pi/CaravanPi/.log/backup.log 2>&1 -# # Backup Dateien starten - @reboot sleep 300 && /home/pi/backup/backup.sh >>/home/pi/CaravanPi/.log/backup.log 2>&1 01 02 * * * /home/pi/backup/backup.sh >>/home/pi/CaravanPi/.log/backup.log 2>&1 # diff --git a/.git_hooks/README.md b/.git_hooks/README.md new file mode 100644 index 0000000..2e27a1e --- /dev/null +++ b/.git_hooks/README.md @@ -0,0 +1,11 @@ +ACHTUNG: +Damit die git hooks funktionieren müssen die beiden Dateien hier ins Verzeichnis .git/hooks kopiert werden. + +Außerdem muss ein Verzeichnis .git_sensible_backup angelegt werden + +Hier die Kommandos + +cd ~/CaravanPi +cp .git_hooks/*commit .git/hooks +chmod +x .git/hooks/*commit +mkdir ~/CaravanPi/.git_sensible_backup \ No newline at end of file diff --git a/.lib/CaravanPiFilesClass.py b/.lib/CaravanPiFilesClass.py index 3cb5db6..1d95826 100644 --- a/.lib/CaravanPiFilesClass.py +++ b/.lib/CaravanPiFilesClass.py @@ -276,12 +276,16 @@ def writeCaravanPiDefaults(self, config_dict): "stromPiInstalled", "gassensorInstalled", "gassensorAlarmActive", + "gassensorAlarmResume", "v230CheckInstalled", "v230CheckAlarmActive", + "v230CheckAlarmResume", "v12BatteryCheckInstalled", "v12BatteryCheckAlarmActive", + "v12BatteryCheckAlarmResume", "v12CarCheckInstalled", "v12CarCheckAlarmActive", + "v12CarCheckAlarmResume", ]: if key in config_dict: config_dict[key] = '1' if config_dict[key] else '0' diff --git a/.systemd-files/flask.service b/.systemd-files/flask.service new file mode 100644 index 0000000..0356ba4 --- /dev/null +++ b/.systemd-files/flask.service @@ -0,0 +1,16 @@ +[Unit] +Description=Flask Webserver +After=network.target + +[Service] +User=pi +WorkingDirectory=/home/pi/CaravanPi/html-flask +ExecStart=/usr/bin/python3 -u /home/pi/CaravanPi/html-flask/flask-main.py +Restart=always +# Logdateien Umleitung, dabei unbuffered einschalten +Environment=PYTHONUNBUFFERED=1 +StandardOutput=append:/home/pi/CaravanPi/.log/flask-main.log +StandardError=append:/home/pi/CaravanPi/.log/flask-main.log + +[Install] +WantedBy=multi-user.target diff --git a/.systemd-files/pir.service b/.systemd-files/pir.service new file mode 100644 index 0000000..e242dc1 --- /dev/null +++ b/.systemd-files/pir.service @@ -0,0 +1,15 @@ +[Unit] +Description=Bewegungsmelder +After=network.target + +[Service] +WorkingDirectory=/home/pi/CaravanPi/pir +ExecStart=/usr/bin/python3 -u /home/pi/CaravanPi/pir/pir.py 120 1 +Restart=always +# Logdateien Umleitung, dabei unbuffered einschalten +Environment=PYTHONUNBUFFERED=1 +StandardOutput=append:/home/pi/CaravanPi/.log/pir.log +StandardError=append:/home/pi/CaravanPi/.log/pir.log + +[Install] +WantedBy=multi-user.target diff --git a/MagicMirror/config/config.js b/MagicMirror/config/config.js index 9ec32e2..af63df1 100644 --- a/MagicMirror/config/config.js +++ b/MagicMirror/config/config.js @@ -47,7 +47,7 @@ modules: [ module: "MMM-SimpleLogo", position: "top_center", config: { - fileUrl: "modules/MMM-SimpleLogo/public/CaravanPi-Logo.png", + fileUrl: "modules/MMM-SimpleLogo/public/CaravanPi-Logo-weiss.png", width: "220px", position: "center", text: "", @@ -99,6 +99,33 @@ modules: [ * CaravanPi Module * ********************************************************** */ + +// bevorzugt nicht mehr die MMM-CaravanPi-xxx einbinden, sondern Grafana Grafen + +/* ------------- +{ + module: 'MMM-GrafanaEmbedded', + position: 'top_right', // This can be any of the regions. + config: { + // http://192.168.178.139:3000/d/mef4p9ZVz/caravanpi-temperaturen?orgId=1&viewPanel=1 + id: "mef4p9ZVz", + host: "192.168.178.139", + port: 3000, + dashboardName: "caravanpi-temperaturen", + orgId: 1, + panelId: 1, + width: "450", + height: "200", + refreshRate: "5m", + from: "now-36h", + to: "now", + } +}, +--------------- */ + + + +/* ------------- { module: "MMM-CaravanPiClimate", position: "top_left", @@ -121,7 +148,9 @@ modules: [ ] } }, +--------------- */ +/* ------------- { module: "MMM-CaravanPiTemperature", position: "top_left", @@ -146,7 +175,9 @@ modules: [ ] } }, +--------------- */ +/* ------------- { module: "MMM-CaravanPiGasWeight", position: "top_left", @@ -160,16 +191,17 @@ modules: [ name: "Alu 6kg Flasche 1", file: "gasScale1", }, - /* { name: "Alu 8kg Flasche 2", file: "gasScale2", }, - */ ] } }, +--------------- */ + +/* ------------- { module: "MMM-CaravanPiPosition", position: "top_left", @@ -184,13 +216,16 @@ modules: [ ] } }, +--------------- */ + + /* ********************************************************** * weitere Module - Vorschläge * ********************************************************** */ -/* +/* ------------- { module: 'MMM-DWD-WarnWeather', position: 'top_right', @@ -207,30 +242,9 @@ modules: [ severityThreshold: 2, } }, -*/ - -/* -{ - module: 'MMM-GrafanaEmbedded', - position: 'top_right', // This can be any of the regions. - config: { - /* http://192.168.178.139:3000/d/mef4p9ZVz/caravanpi-temperaturen?orgId=1&viewPanel=1 */ - id: "mef4p9ZVz", - host: "192.168.178.139", - port: 3000, - dashboardName: "caravanpi-temperaturen", - orgId: 1, - panelId: 1, - width: "450", - height: "200", - refreshRate: "5m", - from: "now-36h", - to: "now", - } -}, -*/ +--------------- */ -/* +/* ------------- { module: "newsfeed", position: "top_right", // This can be any of the regions. Best results in center regions. @@ -254,9 +268,9 @@ modules: [ ] } }, -*/ +--------------- */ -/* +/* ------------- { module: 'MMM-SystemStats', position: 'bottom_bar', @@ -268,7 +282,8 @@ modules: [ singleRow: true, } }, -*/ +--------------- */ + /* ********************************************************** * Remote Control Modul diff --git a/analogSignals/v12Check.py b/analogSignals/v12Check.py index 2291d97..87c5e76 100644 --- a/analogSignals/v12Check.py +++ b/analogSignals/v12Check.py @@ -210,7 +210,16 @@ def main(): print("Alarm in Config einschalten") cplib.writeCaravanPiConfigItem(f"caravanpiDefaults/{v12xmlItemAlarm}", 1) v12CheckAlarmActive = True - + + cplib = CaravanPiFiles() + cplib.handle_sensor_values( + args.screen, # Anzeige am Bildschirm? + "Spannung", # sensor_name = Datenbankname + f"12v{args.battery}", # sensor_id = Filename und Spalte in der Datenbank + ["spannung"], # Liste Spaltennamen + (berechne_spannungsteiler(v12R1, v12R2, Vout=channel.voltage)) # Tupel Sensorwerte + ) + time.sleep(delayAlarm if v12DropDetected else delay) except Exception as e: diff --git a/defaults/caravanpiConfig.xml b/defaults/caravanpiConfig.xml index c040a6f..a1ab58a 100644 --- a/defaults/caravanpiConfig.xml +++ b/defaults/caravanpiConfig.xml @@ -29,7 +29,7 @@ 1 1 0 - 0 + 1 1 2 0 @@ -41,13 +41,13 @@ 150 560 150 - True - True - True - True + 0 + 0 + 0 + 1 - -0.0392266 + -0.0392267 1.5298374 8.9044382 0.2 diff --git a/html-flask/checks_routes.py b/html-flask/checks_routes.py index 44eef8e..a91467b 100644 --- a/html-flask/checks_routes.py +++ b/html-flask/checks_routes.py @@ -37,6 +37,7 @@ {'name': 'Python Bibliotheken', 'key': 'check_python_modules', 'run_check': True}, {'name': 'MagicMirror', 'key': 'check_magicmirror', 'run_check': True}, {'name': 'MariaDB', 'key': 'check_mariadb', 'run_check': True}, + {'name': 'MQTT', 'key': 'check_mqtt', 'run_check': True}, {'name': 'Grafana', 'key': 'check_grafana', 'run_check': True}, {'name': 'Apache Webserver', 'key': 'check_apache', 'run_check': True}, {'name': '1-Wire Bus', 'key': 'check_1_wire', 'run_check': True}, @@ -245,8 +246,13 @@ def check_python_modules(): # Durchsuchen des Verzeichnisses nach Python-Dateien for root, _, files in os.walk(search_dir): + # Verzeichnisse, die als obsolet gekennzeicnet sind, ignorieren + if 'obsolet' in root: + continue + for file in files: - if file.endswith('.py'): + # nur Files betrachten mit der Endung .py und in denen das Wort obsolet nicht vorkommt + if file.endswith('.py') and 'obsolet' not in file: file_path = os.path.join(root, file) with open(file_path, 'r') as f: try: @@ -320,6 +326,24 @@ def check_mariadb(): print(f"Ein Fehler ist aufgetreten: {e}") return False +# --------------------------------------------------------------------------------------------- +# MQTT über den Aufbau einer Verbindung +# ---------------------------------------------------------------------------------------------- +def check_mqtt(): + try: + connection = cplib.create_mqtt_connection() + + # Überprüfen Sie, ob die Verbindung erfolgreich hergestellt wurde + if connection is not None: + connection.disconnect() # Schließen Sie die Verbindung, wenn sie erfolgreich hergestellt wurde + return True + else: + return False + + except Exception as e: + print(f"Ein Fehler ist aufgetreten: {e}") + return False + # --------------------------------------------------------------------------------------------- # Grafana über das Aufrufen der Website # ---------------------------------------------------------------------------------------------- @@ -414,6 +438,12 @@ def check_i2c(): # Entfernen von 76 und 77, wenn sie in der Liste sind i2c_expected_device_addresses = [addr for addr in i2c_expected_device_addresses if addr not in (0x76, 0x77)] + + # Anpassen der erwarteten I2C Adresse aufgrund installierter Gassensoren bzw. 230 V Überwachung + # diese benötigen einen AD Wandler auf Adresse 48 + if cplib.typwandlung(cplib.readCaravanPiConfigItem("caravanpiDefaults/gassensorInstalled"), "bool") or cplib.typwandlung(cplib.readCaravanPiConfigItem("caravanpiDefaults/v230CheckInstalled"), "bool"): + i2c_expected_device_addresses.append(0x48) + found_devices_hex = set(scan_i2c_bus(i2c_bus_number)) # Hex-Strings wie '0x20' expected_devices = set(i2c_expected_device_addresses) # Ganzzahlen @@ -825,6 +855,27 @@ def route_check_mariadb(): return render_template('check_base_template.html', title='Check MariaDB', current_check='check_mariadb', check_list=check_list, check_results=check_results, next_check_route=next_route) + @app.route('/check_mqtt') + def route_check_mqtt(): + check_info = next((item for item in check_list if item['key'] == 'check_mqtt'), None) + + # Überprüfen, ob der Check ausgeführt werden soll + if check_info: + next_route = find_next_route('check_mqtt') + if check_info['run_check']: + # Check durchführen + result = check_mqtt() + check_results['check_mqtt']['result'] = 'OK' if result else 'Fehler' + check_results['check_mqtt']['color'] = 'green' if result else 'red' + else: + # Weiterleitung zum nächsten Check, wenn dieser Check übersprungen werden soll + return redirect(url_for(next_route)) + else: + # Weiterleitung zum Ende, wenn der Check nicht gefunden wurde + return redirect(url_for('route_check_final')) + + return render_template('check_base_template.html', title='Check MQTT', current_check='check_mqtt', check_list=check_list, check_results=check_results, next_check_route=next_route) + @app.route('/check_grafana') def route_check_grafana(): check_info = next((item for item in check_list if item['key'] == 'check_grafana'), None) diff --git a/install_CaravanPi.sh b/install_CaravanPi.sh index edc9c4f..85bed92 100755 --- a/install_CaravanPi.sh +++ b/install_CaravanPi.sh @@ -3,31 +3,81 @@ # Installieren des CaravanPi # -# Titelbild ausgeben +# Alle Ausgaben zusätzlich in ein Logfile schreiben +LOG_FILE="$HOME/install_CaravanPi.log" +ip_address=$(hostname -I | awk '{print $1}') + +# Schreibe die Raspberry Pi Revision und IP-Adresse ins Logfile +{ + echo "------------------------------------------------------------" + echo "Inhalt von /proc/cpuinfo:" + echo "------------------------------------------------------------" + cat /proc/cpuinfo + echo "------------------------------------------------------------" + echo "IP-Adresse: $ip_address" + echo "------------------------------------------------------------" +} > "$LOG_FILE" + +# alle weiteren Ausgaben in das Logfile clonen +exec > >(tee -a "$LOG_FILE") 2>&1 + echo -e "\e[0m" -echo ' ' -echo ' ,ad8888ba, 88888888ba 88' -echo ' d8"" `"8b 88 "8b ""' -echo 'd8" 88 ,8P ' -echo '88 ,adPPYYba, 8b,dPPYba, ,adPPYYba, 8b d8 ,adPPYYba, 8b,dPPYba, 88aaaaaa8P" 88' -echo '88 "" `Y8 88P" "Y8 "" `Y8 `8b d8" "" `Y8 88P" `"8a 88""""""" 88' -echo 'Y8, ,adPPPPP88 88 ,adPPPPP88 `8b d8" ,adPPPPP88 88 88 88 88' -echo ' Y8a. .a8P 88, ,88 88 88, ,88 `8b,d8" 88, ,88 88 88 88 88' -echo ' `"Y8888Y"" `"8bbdP"Y8 88 `"8bbdP"Y8 "8" `"8bbdP"Y8 88 88 88 88' -echo ' ' +echo ' ' +echo ' $$$$$$\ $$$$$$$\ $$\ ' +echo ' $$ __$$\ $$ __$$\ \__| ' +echo ' $$ / \__| $$$$$$\ $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$\ $$$$$$$\ $$ | $$ |$$\ ' +echo ' $$ | \____$$\ $$ __$$\ \____$$\\$$\ $$ |\____$$\ $$ __$$\ $$$$$$$ |$$ | ' +echo ' $$ | $$$$$$$ |$$ | \__|$$$$$$$ |\$$\$$ / $$$$$$$ |$$ | $$ |$$ ____/ $$ | ' +echo ' $$ | $$\ $$ __$$ |$$ | $$ __$$ | \$$$ / $$ __$$ |$$ | $$ |$$ | $$ | ' +echo ' \$$$$$$ |\$$$$$$$ |$$ | \$$$$$$$ | \$ / \$$$$$$$ |$$ | $$ |$$ | $$ | ' +echo ' \______/ \_______|\__| \_______| \_/ \_______|\__| \__|\__| \__| ' +echo ' ' echo -e "\e[0m" + +# ------------------------------------------------------------------ +# parameter Verarbeitung +# ------------------------------------------------------------------ -# Überprüfen, ob das Skript mit dem Parameter -force aufgerufen wird +# Überprüfen, ob das Skript mit dem Parameter "apply" aufgerufen wird # Nur dann werden die Installations Kommandos tatsächlich ausgeführt SIMULATE=true -for arg in "$@"; do - if [ "$arg" == "-force" ]; then - SIMULATE=false - break - fi -done + +# Überprüfen, wie das Skript gestartet wurde +# Das Skript kann auf dem Raspberry direkt aufgerufen worden sein (CaravanPi Repository wurde vorher schon geklont) oder +# das Skript wird über "bash -c ... curl ..." aufgerufen, also ohne vorheriges Klonen. +# entprechend muss der Parameter apply anders erkannt werden + +p0=$0 +# start ohne "bash -c" und es gibt einen Parameter +if [ $0 != 'bash' -a "$1." != "." ]; then + # wird lokal ausgeführt + # $1 enthält den Parameter + p0=$1 +fi + +# Den Parameter in Kleinbuchstaben umwandeln +p0=$(echo $p0 | awk '{print tolower($0)}') + +# Entsprechend dem Parameter handeln +if [ "$p0" == "apply" ]; then + SIMULATE=false +fi + +# ------------------------------------------------------------------ +# Variable definieren +# ------------------------------------------------------------------ + +BOOT_CONFIG_FILE_OLD="/boot/config.txt" +BOOT_CONFIG_FILE_NEW="/boot/firmware/config.txt" + +STD_HOSTNAME="CaravanPi" + +WIFI_CONFIG_FILE="/etc/wpa_supplicant/wpa_supplicant.conf" +WIFI_BASIC_CONFIG="ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev +update_config=1 +country=DE" CARAVANPI_DIR="$HOME/CaravanPi" CARAVANPI_LOCAL_BACKUP="$HOME/CaravanPilocalBackup" @@ -37,8 +87,59 @@ MAGICMIRROR_DIR="$HOME/MagicMirror" GRAFANA_INI="/etc/grafana/grafana.ini" +RASPBERRY_PI_BACKUP_CLOUD_DIR="$HOME/Raspberry-Pi-Backup-Cloud" + +# ANSI Farbcodes +no_color='\033[0m' # Keine Farbe +nc="$no_color" + red='\033[0;31m' -nc='\033[0m' # No Color +green='\033[0;32m' +yellow='\033[0;33m' +blue='\033[0;34m' +magenta='\033[0;35m' +cyan='\033[0;36m' + +read_colored() { + local color_code="$1" + local prompt="$2" + local var_name="$3" + + # Wähle die Farbe basierend auf dem Parameter + case "$color_code" in + red) color=$red ;; + green) color=$green ;; + yellow) color=$yellow ;; + blue) color=$blue ;; + magenta) color=$magenta ;; + cyan) color=$cyan ;; + *) color=$no_color ;; # Standardfarbe, falls keine Übereinstimmung gefunden wurde + esac + + # Zeige den farbigen Prompt an und lese die Eingabe + echo -en "${color}${prompt}${no_color}" + read -r "$var_name" +} + +echo_colored() { + local color_code="$1" + local output="$2" + + # Wähle die Farbe basierend auf dem Parameter + case "$color_code" in + red) color=$red ;; + green) color=$green ;; + yellow) color=$yellow ;; + blue) color=$blue ;; + magenta) color=$magenta ;; + cyan) color=$cyan ;; + *) color=$no_color ;; # Standardfarbe, falls keine Übereinstimmung gefunden wurde + esac + + # Zeige den farbigen Prompt an und lese die Eingabe + echo -e "${color}${output}${no_color}" +} + note() { # Paramter $1 enthält die Beschreibung des nächsten Schrittes @@ -50,6 +151,16 @@ note() { # Prüfen, ob die Ausgabe in Rot erfolgen soll if [ "$color" == "red" ]; then echo -e "${red}" + elif [ "$color" == "green" ]; then + echo -e "${green}" + elif [ "$color" == "yellow" ]; then + echo -e "${yellow}" + elif [ "$color" == "blue" ]; then + echo -e "${blue}" + elif [ "$color" == "magenta" ]; then + echo -e "${magenta}" + elif [ "$color" == "cyan" ]; then + echo -e "${cyan}" else echo -e "${nc}" fi @@ -70,10 +181,22 @@ run_cmd() { if [ "$SIMULATE" = true ]; then echo -e "${red}Simuliere:${nc} $@" else + echo -e "${red}Führe aus:${nc} $@" eval "$@" fi } +# Funktion zur Überprüfung der Installation +check_installed() { + dpkg -s $1 &> /dev/null + + if [ $? -eq 0 ]; then + return 0 # Installiert + else + return 1 # Nicht installiert + fi +} + # Backup-Funktion, die das Skript localBackup.sh aufruft backup_caravanpi() { echo "Starte Backup für CaravanPi..." @@ -86,6 +209,18 @@ backup_caravanpi() { fi } +list_configured_ssids() { + # Überprüfen, ob die Konfigurationsdatei existiert + if [ ! -f "$WIFI_CONFIG_FILE" ]; then + echo "keine Wifi SSIDs konfiguriert" + return 1 + fi + + echo "aktuell konfigurierte SSIDs:" + # Extrahieren und auflisten aller SSIDs + sudo grep 'ssid=' "$WIFI_CONFIG_FILE" | sed -e 's/.*ssid="\([^"]*\)".*/\1/' +} + #m Funktion zum Updaten des Raspberry OS update_raspberry_os() { echo "Aktualisiere Paketquellen..." @@ -100,44 +235,169 @@ update_raspberry_os() { echo "Bereinige nicht mehr benötigte Pakete..." run_cmd "sudo apt-get autoremove -y" - echo "Überprüfe, ob ein Neustart erforderlich ist..." - if [ -f /var/run/reboot-required ]; then - echo "Ein Neustart ist erforderlich, um die Aktualisierungen zu vervollständigen." - echo "Bitte führen Sie 'sudo reboot' aus." - else - echo "Kein Neustart erforderlich." +} + +# Funktion zum Konfigurieren des Raspberry OS +config_raspberry_os() { + echo -e "${red}Achtung: Das setzen der Sprache wird erst nach eine Rebbot fehlerfrei sein.${nc}" + echo "Ignorieren Sie daher eventuell auftretende Fehler zur Spracheinstellung." + echo "Führen Sie jedoch nach diesem Kapitel einen rebbot durch" + echo + echo "Land, Sprache und Zeitzone einstellen" + run_cmd "sudo raspi-config nonint do_change_locale de_DE.UTF-8" + run_cmd "sudo raspi-config nonint do_change_timezone Europe/Berlin" + + echo "Booten zum Desktop einstellen" + run_cmd "sudo raspi-config nonint do_boot_behaviour B4" + + echo "Overscan (schwarzer Bildschirmrand) deaktivieren" + run_cmd "sudo raspi-config nonint do_overscan 1" + + echo "Hostnamen setzen" + read_colored "cyan" "Geben Sie den neuen Hostnamen ein (Default: $STD_HOSTNAME): " answer + if [[ -z $answer ]]; then + answer=$STD_HOSTNAME fi + run_cmd "sudo raspi-config nonint do_hostname $answer" + + echo "SSH aktivieren" + run_cmd "sudo raspi-config nonint do_ssh 0" + + # Reboot anfordern + # es ist noch zu prüfen, ob das immer gemacht werden muss + # + sudo touch /var/run/reboot-required } -# Funktion zur Überprüfung der Installation -check_installed() { - dpkg -s $1 &> /dev/null +# Funktion zum Konfigurieren des WLAN +config_wifi() { + # Überprüfen, ob die Konfigurationsdatei existiert + if [ ! -f "$WIFI_CONFIG_FILE" ]; then + echo "Konfigurationsdatei nicht gefunden. Erstelle eine neue mit Grundkonfiguration." + run_cmd "echo \"$WIFI_BASIC_CONFIG\" | sudo tee \"$WIFI_CONFIG_FILE\" > /dev/null" + fi - if [ $? -eq 0 ]; then - return 0 # Installiert + while true; do + echo + list_configured_ssids + echo + + read_colored "cyan" "Möchten Sie die Wifi-Konfiguration ergänzen? (j/N): " answer + if ! [[ "$answer" =~ ^[Jj]$ ]]; then + break + fi + + # Eingabe der WIFI Daten + echo + echo "Geben Sie die notwendigen Daten ein" + read_colored "cyan" "SSID: " ssid + read_colored "cyan" "Passwort: " password + echo + + # Überprüfen, ob SSID bereits konfiguriert ist + if sudo grep -q "ssid=\"$ssid\"" "$WIFI_CONFIG_FILE"; then + echo "Eine Konfiguration für SSID $ssid existiert bereits. Nichts zu tun!" + else + # Wenn die SSID noch nicht konfiguriert ist, hinzufügen + run_cmd "wpa_passphrase \"$ssid\" \"$password\" | sudo tee -a \"$WIFI_CONFIG_FILE\" > /dev/null" + echo "Neue Konfiguration für $ssid hinzugefügt." + + # WLAN-Dienst neu starten, um die neue Konfiguration zu übernehmen + run_cmd "sudo systemctl restart wpa_supplicant" + + echo "WLAN-Konfiguration aktualisiert." + fi + done +} + + +# Funktion zum Kponfigurieren des Raspberry OS +config_protocolls() { + echo "I2C aktivieren" + run_cmd "sudo raspi-config nonint do_i2c 0" + echo "erkannte Devices am I2C:" + run_cmd "i2cdetect -y 1" + + echo "1-Wire aktivieren" + run_cmd "sudo raspi-config nonint do_onewire 0" + + echo "1-Wire konfigurieren" + run_cmd "sudo modprobe wire" + run_cmd "sudo modprobe w1-gpio" + run_cmd "sudo modprobe w1-therm" + + echo "1-Wire in /etc/modules aufnehmen ..." + if ! grep -q '^wire$' /etc/modules; then + run_cmd "echo \"wire\" | sudo tee -a /etc/modules > /dev/null" + fi + if ! grep -q '^w1-gpio$' /etc/modules; then + run_cmd "echo \"w1-gpio\" | sudo tee -a /etc/modules > /dev/null" + fi + if ! grep -q '^w1-therm$' /etc/modules; then + run_cmd "echo \"w1-therm\" | sudo tee -a /etc/modules > /dev/null" + fi + + # Konfiguration von 1-Wire auf GPIO Pin 18 in /boot/config.txt bzw. /boot/firmware/config.txt, falls noch nicht vorhanden + BOOT_CONFIG_FILE="$BOOT_CONFIG_FILE_OLD" + if [ -f "$BOOT_CONFIG_FILE_NEW" ]; then + BOOT_CONFIG_FILE="$BOOT_CONFIG_FILE_NEW" + fi + + echo "Lege 1-Wire auf GPIO Pin 18 (CaravanPi Platine) ..." + + # Prüfen, ob ein Eintrag für dtoverlay=w1-gpio vorhanden ist + if grep -q '^dtoverlay=w1-gpio' "$BOOT_CONFIG_FILE"; then + # Prüfen, ob der spezifische Eintrag mit gpiopin=18 existiert + if ! grep -q '^dtoverlay=w1-gpio,gpiopin=18$' "$BOOT_CONFIG_FILE"; then + # Wenn dtoverlay=w1-gpio vorhanden, aber nicht mit gpiopin=18, dann vorhandenes auskommentieren + run_cmd "sudo sed -i '/^dtoverlay=w1-gpio/ s/^/# Alten Eintrag von der Installationsroutine CaravanPi auskommentiert\n#&/' \"$BOOT_CONFIG_FILE\"" + # Und neuen Eintrag ergänzen + run_cmd "echo \"# CaravanPi Temperatur Sensoren über 1-Wire auf GPIO Pin 18\" | sudo tee -a \"$BOOT_CONFIG_FILE\" > /dev/null" + run_cmd "echo \"dtoverlay=w1-gpio,gpiopin=18\" | sudo tee -a \"$BOOT_CONFIG_FILE\" > /dev/null" + else + echo "Eintrag für dtoverlay=w1-gpio,gpiopin=18 ist bereits vorhanden. Keine Änderung notwendig." + fi else - return 1 # Nicht installiert + # Wenn kein Eintrag für dtoverlay=w1-gpio vorhanden ist, dann hinzufügen + run_cmd "echo \"# CaravanPi Temperatur Sensoren über 1-Wire auf GPIO Pin 18\" | sudo tee -a \"$BOOT_CONFIG_FILE\" > /dev/null" + run_cmd "echo \"dtoverlay=w1-gpio,gpiopin=18\" | sudo tee -a \"$BOOT_CONFIG_FILE\" > /dev/null" fi } # Funktion zum Klonen/Aktualisieren des CaravanPi Repositories install_update_caravanpi() { if [ -d "$CARAVANPI_DIR" ]; then + cd "$CARAVANPI_DIR" + # Ermittle den aktuellen Branch + local current_branch=$(git rev-parse --abbrev-ref HEAD) + + echo echo "CaravanPi Repository ist bereits auf diesem Gerät vorhanden." - read -p "Möchten Sie das Repository aktualisieren? (j/N): " answer + echo "Lokal wird der Branch - $current_branch - benutzt. Dieser wird mit dem entsprechenden Branch auf github verglichen" + echo + read_colored "cyan" "Möchten Sie das Repository aktualisieren? (j/N): " answer if [[ "$answer" =~ ^[Jj]$ ]]; then cd "$CARAVANPI_DIR" echo "Prüfe Änderungen..." git fetch - local changes=$(git diff HEAD..origin/master) + + local target_branch="master" + if [[ "$current_branch" == "development" ]]; then + target_branch="development" + fi + + local changes=$(git diff HEAD..origin/$target_branch) + if [ -n "$changes" ]; then - echo "Änderungen verfügbar:" - git diff --stat HEAD..origin/master - read -p "Möchten Sie diese Änderungen anwenden? (j/n): " apply_changes - if [[ "$apply_changes" == "j" || "$apply_changes" == "J" ]]; then + "Änderungen verfügbar auf $target_branch Branch:" + git diff --stat HEAD..origin/$target_branch + echo + read_colored "cyan" "Möchten Sie diese Änderungen anwenden? (j/n): " apply_changes + if [[ "$apply_changes" =~ ^[Jj]$ ]]; then + echo "Backup der bisherigen Konfigurationen wird ausgeführt" backup_caravanpi - echo "Aktualisiere CaravanPi Repository..." - run_cmd "git merge origin/master" + echo "Aktualisiere CaravanPi Repository von $target_branch..." + run_cmd "git merge origin/$target_branch" else echo "Aktualisierung abgebrochen." fi @@ -148,304 +408,845 @@ install_update_caravanpi() { echo "Aktualisierung nicht gewünscht." fi else - # Repository herunterladen echo "CaravanPi Repository wird heruntergeladen..." + # Klonen des Repositories in den spezifizierten Branch run_cmd "git clone https://github.com/spitzlbergerj/CaravanPi.git \"$CARAVANPI_DIR\"" + run_cmd "cd \"$CARAVANPI_DIR\"" + run_cmd "git fetch origin development:development" + + # Ermittle die verfügbaren Branches vom Remote-Repository + echo "Verfügbare Branches:" + run_cmd "git branch" + + # nachfolgendes nur falls nicht nur simuliert (zu komplex für run_cmd) + if [ "$SIMULATE" = false ]; then + while true; do + # Frage nach dem gewünschten Branch + echo "Im Regelfall nutzen Sie bitte den master Branch!" + read_colored "cyan" "Welchen Branch möchten Sie nutzen? (default: master) " target_branch + + if [[ -z $target_branch ]]; then + target_branch="master" + fi + + # Überprüfen, ob der eingegebene Branch existiert + if git rev-parse --verify "$target_branch" > /dev/null 2>&1; then + echo "Wechsle zu Branch '$target_branch'..." + git checkout "$target_branch" + break + else + echo "Der Branch '$target_branch' existiert nicht. Überprüfen Sie die Eingabe und versuchen Sie es erneut." + echo + fi + done + fi fi + # git hooks aktivieren + echo "git hooks anlegen" + cd "$CARAVANPI_DIR" + run_cmd "cp .git_hooks/*commit .git/hooks" + run_cmd "chmod +x .git/hooks/*commit" + run_cmd "mkdir ~/CaravanPi/.git_sensible_backup" + + echo echo "Ein/Ausschalter Skripte installieren" run_cmd "sudo cp /home/pi/CaravanPi/pishutdown/pishutdown.py /usr/local/bin" run_cmd "sudo cp /home/pi/CaravanPi/pishutdown/pishutdown.service /etc/systemd/system" run_cmd "sudo systemctl enable pishutdown" run_cmd "sudo systemctl start pishutdown" - - echo "1-Wire installieren" - run_cmd "sudo modprobe wire" - run_cmd "sudo modprobe w1-gpio" - run_cmd "sudo modprobe w1-therm" - - echo "Konfiguriere 1-Wire Module..." - if ! grep -q '^wire$' /etc/modules; then - run_cmd "echo \"wire\" | sudo tee -a /etc/modules > /dev/null" - fi - if ! grep -q '^w1-gpio$' /etc/modules; then - run_cmd "echo \"w1-gpio\" | sudo tee -a /etc/modules > /dev/null" - fi - if ! grep -q '^w1-therm$' /etc/modules; then - run_cmd "echo \"w1-therm\" | sudo tee -a /etc/modules > /dev/null" - fi - - # Konfiguration von 1-Wire auf GPIO Pin 18 in /boot/config.txt, falls noch nicht vorhanden - echo "Lege 1-Wire auf GPIO Pin 18..." - if ! grep -q '^dtoverlay=w1-gpio,gpiopin=18$' /boot/config.txt; then - run_cmd "echo \"# Temperature sensor on 1-Wire\" | sudo tee -a /boot/config.txt > /dev/null" - run_cmd "echo \"dtoverlay=w1-gpio,gpiopin=18\" | sudo tee -a /boot/config.txt > /dev/null" - fi - } # Installation MagicMirror install_magicmirror() { - read -p "Möchten Sie MagicMirror installieren? (j/N): " answer - if [[ "$answer" =~ ^[Jj]$ ]]; then - # Pfad zu MagicMirror - MAGICMIRROR_DIR="$HOME/MagicMirror" - - # Überprüfen, ob MagicMirror bereits geklont wurde - if [ -d "$MAGICMIRROR_DIR" ]; then - echo "MagicMirror scheint bereits installiert zu sein. Überspringe das Installieren..." + # Pfad zu MagicMirror + MAGICMIRROR_DIR="$HOME/MagicMirror" + + # Überprüfen, ob MagicMirror bereits geklont wurde + if [ -d "$MAGICMIRROR_DIR" ]; then + echo "MagicMirror scheint bereits installiert zu sein. Überspringe das Installieren..." + echo "Notwendige Updates führen Sie dort bitte selbst durch. Skripte hierzu finden Sie auf https://github.com/sdetweil/MagicMirror_scripts" + else + echo "MagicMirror Repository wird heruntergeladen..." + cd $HOME + # run_cmd kann hier nicht verwendet werden, weil curl vor der Übergabe an run_cmd ausgeführt wird + # daher hier direkt abgefragt + + echo "In manchen Fällen wird während der Installaion von MagicMirror nachfolgende Warnung (vielfach) ausgegeben" + echo " ... MaxListenersExceededWarning: Possible EventEmitter memory leak detected ..." + echo "Diese Warnungen können Sie ignorieren. Die Installation klappt dennoch. Installation daher nicht abbrechen!!" + echo + read_colored "cyan" "Weiter mit Enter" irrelevant + + + if [ "$SIMULATE" = true ]; then + echo -e "${red}Simuliere:${nc} bash -c \"\$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh)\"" else - echo "MagicMirror Repository wird heruntergeladen..." - cd $HOME - run_cmd "bash -c \"$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh)\"" + echo -e "${red}Führe aus:${nc} bash -c \"\$(curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh)\"" + + # zunächst wird das Skript heruntergeladen und zwiwchengespeichert + curl -sL https://raw.githubusercontent.com/sdetweil/MagicMirror_scripts/master/raspberry.sh > /tmp/raspberry.sh + # dann ausführen + bash /tmp/raspberry.sh fi - else - echo "Installation von MagicMirror übersprungen." fi } install_apache() { - read -p "Möchten Sie den Apache Webserver installieren? (j/N): " answer - if [[ "$answer" =~ ^[Jj]$ ]]; then - echo "Apache installieren ...." - run_cmd "sudo apt install apache2 -y" + echo "Apache installieren ...." + run_cmd "sudo apt-get install apache2 -y" - echo "Starte Apache2 und aktiviere den Autostart..." - run_cmd "sudo systemctl start apache2" - run_cmd "sudo systemctl enable apache2" + echo "Starte Apache2 und aktiviere den Autostart..." + run_cmd "sudo systemctl start apache2" + run_cmd "sudo systemctl enable apache2" - # Überprüfe den Status des Apache2-Service - echo "Überprüfe den Status des Apache2-Dienstes..." - run_cmd "sudo systemctl status apache2" + # Überprüfe den Status des Apache2-Service + echo "Überprüfe den Status des Apache2-Dienstes..." + run_cmd "sudo systemctl status apache2" - echo "Apache2 wurde erfolgreich installiert und läuft." - else - echo "Installation von Apache übersprungen." - fi + # PHP im Apache aktivieren + echo "Füge PHP Fähigkeit hinzu ..." + run_cmd "sudo apt-get install php php-mbstring" + + echo "Apache2 wurde erfolgreich installiert und läuft." } # Installation MariaDB install_mariadb() { - read -p "Möchten Sie MariaDB installieren und alle Tabellen anlegen? (j/N): " answer - if [[ "$answer" =~ ^[Jj]$ ]]; then - echo "MariaDB Server installieren ...." - run_cmd "sudo apt-get install -y mariadb-server" - - echo "Installation absichern ... " - echo " Bitte folgen Sie den Anweisungen auf dem Bildschirm, um MariaDB und den root-Benutzer abzusichern." - echo " Vergeben Sie ein starkes Passwort für den MariaDB root-Benutzer und merken Sie sich dieses." - echo " Entfernen Sie anonyme Benutzer und deaktivieren Sie den Root-Login aus der Ferne." - echo " Löschen Sie die Testdatenbanken." - run_cmd "sudo mysql_secure_installation" - - echo "Benutzer CaravanPi anlegen ... " - read -sp " Bitte geben Sie ein Passwort für den 'caravanpi' MariaDB Benutzer ein: " caravanpi_password - - echo " Benutzer wird angelegt ..." - run_cmd "sudo mysql -e \"CREATE USER 'caravanpi'@'localhost' IDENTIFIED BY '$caravanpi_password';\"" + echo "MariaDB Server installieren ...." + run_cmd "sudo apt-get install -y mariadb-server" + + echo + echo + caravanpi_password="" + while [ -z "$caravanpi_password" ]; do + read_colored "cyan" "Bitte geben Sie ein Passwort für den Benutzer 'caravanpi' auf der MariaDB ein: " caravanpi_password + if [ -z "$caravanpi_password" ]; then + echo "Das Passwort darf nicht leer sein. Bitte versuchen Sie es erneut." + fi + done + + echo + echo " Benutzer CaravanPi wird angelegt ..." + run_cmd "sudo mysql -e \"CREATE USER 'caravanpi'@'localhost' IDENTIFIED BY '$caravanpi_password';\"" - echo " Datenbank wird angelegt ..." - run_cmd "sudo mysql -e \"CREATE DATABASE CaravanPiValues;\"" - run_cmd "sudo mysql -e \"GRANT ALL PRIVILEGES ON CaravanPiValues.* TO 'caravanpi'@'localhost';\"" - run_cmd "sudo mysql -e \"FLUSH PRIVILEGES;\"" + echo " Datenbank CaravanPiValues wird angelegt ..." + run_cmd "sudo mysql -e \"CREATE DATABASE CaravanPiValues;\"" + run_cmd "sudo mysql -e \"GRANT ALL PRIVILEGES ON CaravanPiValues.* TO 'caravanpi'@'localhost';\"" + run_cmd "sudo mysql -e \"FLUSH PRIVILEGES;\"" - echo " Datenbanktabellen werden angelegt ..." - run_cmd "sudo mysql CaravanPiValues < $CARAVANPI_MARIADB_CREATE_TABLES" + echo " Datenbanktabellen werden angelegt ..." + run_cmd "sudo mysql CaravanPiValues < $CARAVANPI_MARIADB_CREATE_TABLES" - else - echo "Installation von MariaDB übersprungen." - fi + echo + echo "Die Datenbank enthält nun folgende Tabellen:" + run_cmd "sudo mysql -u'caravanpi' -p'$caravanpi_password' -e \"SHOW TABLES in CaravanPiValues\"" } # Installation phpmyadmin install_phpmyadmin() { - read -p "Möchten Sie phpmyadmin installieren? (j/N): " answer - if [[ "$answer" =~ ^[Jj]$ ]]; then - echo "phpmyadmin installieren ...." - run_cmd "sudo apt install phpmyadmin" - - echo "Konfiguriere Apache2 für phpMyAdmin..." - run_cmd "sudo phpenmod mbstring" - run_cmd "sudo systemctl restart apache2" - else - echo "Installation von phpmyadmin übersprungen." - fi + echo "phpmyadmin installieren ...." + echo + echo -e "${red}Achtung: Sie bekommen während der nachfolgenden Installation einige Fragen gestellt:${nc}" + echo " - die Frage nach dem Webserver beantworten Sie mit Apache2" + echo -e " ${red}ACHTUNG${nc}, hier unbedingt ${red}Leertaaste im Feld Apache2${nc} drücken, Stern erscheint, dann TAB zu OK" + echo + echo " - die Frage 'Konfigurieren der Datenbank für phpmyadmin mit dbconfig-common?' beantworten Sie mit JA! (TAB zu JA)" + echo + echo " - die Frage 'Passwort für phpmyadmin Benutzer?' beantworten Sie mit einem Return" + echo + read_colored "cyan" "Weiter mit Enter" irrelevant + echo + run_cmd "sudo apt-get install phpmyadmin" + + echo "Konfiguriere Apache2 für phpMyAdmin..." + run_cmd "sudo phpenmod mbstring" + + run_cmd "echo \"# phpmyadmin aktivieren\" | sudo tee -a /etc/apache2/apache2.conf > /dev/null" + run_cmd "echo \"Include /etc/phpmyadmin/apache.conf\" | sudo tee -a /etc/apache2/apache2.conf > /dev/null" + run_cmd "sudo systemctl restart apache2" +} + +# Absichern MariaDB - erst nsch Installation von myphpadmin! +secure_mariadb() { + echo "MariaDB Server absichern ...." + echo + echo + root_password="" + while [ -z "$root_password" ]; do + read_colored "cyan" "Bitte geben Sie ein Passwort für den Benutzer 'root' auf der MariaDB ein: " root_password + if [ -z "$root_password" ]; then + echo "Das Passwort darf nicht leer sein. Bitte versuchen Sie es erneut." + fi + done + + echo + echo "Installation absichern ... " + + # wir ersetzen hier sudo mysql_secure_installation durch eine Reihe von Einzelbefehlen, da + # mysql_secure_installation micht gut innerhalb eines Skriptes ausführbar ist + + # SQL-Befehle, um die MariaDB-Sicherheitseinstellungen anzupassen + sql_commands=" + ALTER USER 'root'@'localhost' IDENTIFIED BY '${root_password}'; + DELETE FROM mysql.user WHERE User=''; + DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); + DROP DATABASE IF EXISTS test; + DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; + FLUSH PRIVILEGES; + " + run_cmd "sudo mysql -u root -e \"$sql_commands\"" } + # Installation Grafana install_grafana() { - read -p "Möchten Sie Grafana installieren? (j/N): " answer - if [[ "$answer" =~ ^[Jj]$ ]]; then - # Füge das Grafana GPG Schlüssel hinzu - echo "Füge Grafana GPG Schlüssel hinzu..." - run_cmd "curl https://packages.grafana.com/gpg.key | sudo apt-key add -" - - # Füge das Grafana Repository hinzu - echo "Füge das Grafana Repository hinzu..." - run_cmd "echo \"deb https://packages.grafana.com/oss/deb stable main\" | sudo tee -a /etc/apt/sources.list.d/grafana.list" - - # Aktualisiere die Paketliste - echo "Aktualisiere Paketlisten..." - run_cmd "sudo apt update" - - # Installiere Grafana - echo "Installiere Grafana..." - run_cmd "sudo apt install grafana -y" - - # Starte den Grafana-Service und stelle sicher, dass er beim Booten läuft - echo "Starte Grafana und aktiviere den Autostart..." - run_cmd "sudo systemctl start grafana-server" - run_cmd "sudo systemctl enable grafana-server" - - # Sichere die originale grafana.ini Datei - run_cmd "sudo cp $GRAFANA_INI \"${GRAFANA_INI}.bak\"" - - # Aktualisiere die Konfiguration für den anonymen Zugriff - echo "Aktualisiere Grafana-Konfiguration für anonymen Zugriff..." - run_cmd "sudo sed -i '/\[auth.anonymous\]/!b;n;c\enabled = true' $GRAFANA_INI" - run_cmd "sudo sed -i '/\[auth.anonymous\]/!b;n;n;c\org_role = Viewer' $GRAFANA_INI" - - # Aktualisiere Sicherheitseinstellungen zur Einbettung - echo "Erlaube das Einbetten von Grafana-Dashboards..." - run_cmd "sudo sed -i '/\[security\]/!b;n;c\allow_embedding = true' $GRAFANA_INI" - - # Starte den Grafana-Dienst neu, um die Konfigurationsänderungen zu übernehmen - echo "Starte Grafana-Dienst neu..." - run_cmd "sudo systemctl restart grafana-server" - - # Überprüfe den Status des Grafana-Dienstes - echo "Überprüfe den Status des Grafana-Dienstes..." - run_cmd "sudo systemctl status grafana-server" - - echo "Grafana wurde erfolgreich installiert und läuft." - else - echo "Installation von Grafana übersprungen." - fi -} + # Füge APT Keys hinzu + echo "Füge APT Keys hinzu" + run_cmd "sudo mkdir -p /etc/apt/keyrings/" + run_cmd "wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null" -# Installation Python Module -install_python_modules() { - read -p "Möchten Sie die Python Module installieren? (j/N): " answer - if [[ "$answer" =~ ^[Jj]$ ]]; then - echo "Python Module installieren ...." + # Füge das Grafana Repository hinzu + echo "Füge das Grafana Repository hinzu..." + run_cmd "echo \"deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main\" | sudo tee -a /etc/apt/sources.list.d/grafana.list" - run_cmd "sudo apt-get install i2c-tools" + # Paketliste nochmal aktualisieren + echo "Aktualisiere Paketlisten..." + run_cmd "sudo apt-get update" + # Installiere Grafana + echo "Installiere Grafana..." + run_cmd "sudo apt-get install -y grafana" - run_cmd "pip install Flask" - run_cmd "pip install mysql-connector-python" + # Starte den Grafana-Service und stelle sicher, dass er beim Booten läuft + echo "Starte Grafana und aktiviere den Autostart..." + run_cmd "sudo systemctl enable grafana-server" + run_cmd "sudo systemctl start grafana-server" - else - echo "Installation von Python Module übersprungen." - fi + # Sichere die originale grafana.ini Datei + run_cmd "sudo cp $GRAFANA_INI \"${GRAFANA_INI}.bak\"" + + # Aktualisiere die Konfiguration für den anonymen Zugriff + echo "Aktualisiere Grafana-Konfiguration für anonymen Zugriff..." + run_cmd "sudo sed -i '/\[auth.anonymous\]/!b;n;c\enabled = true' $GRAFANA_INI" + run_cmd "sudo sed -i '/\[auth.anonymous\]/!b;n;n;c\org_role = Viewer' $GRAFANA_INI" + + # Aktualisiere Sicherheitseinstellungen zur Einbettung + echo "Erlaube das Einbetten von Grafana-Dashboards..." + run_cmd "sudo sed -i '/\[security\]/!b;n;c\allow_embedding = true' $GRAFANA_INI" + + # Starte den Grafana-Dienst neu, um die Konfigurationsänderungen zu übernehmen + echo "Starte Grafana-Dienst neu..." + run_cmd "sudo systemctl restart grafana-server" + + # Überprüfe den Status des Grafana-Dienstes + echo "Überprüfe den Status des Grafana-Dienstes..." + run_cmd "sudo systemctl status grafana-server" + + echo "Grafana wurde erfolgreich installiert und läuft." } # Installation Geräte Librarys install_libraries() { - read -p "Möchten Sie die Geräte Libraries installieren? (j/N): " answer - if [[ "$answer" =~ ^[Jj]$ ]]; then - echo "Libraries installieren ...." + echo "Libraries installieren ...." + cd "$CARAVANPI_DIR/.lib" - run_cmd "sudo apt-get install build-essential python-dev python-smbus git" - - run_cmd "git clone https://github.com/adafruit/Adafruit_Python_ADS1x15" - run_cmd "cd Adafruit_Python_ADS1x15; sudo python3 setup.py install" + run_cmd "sudo apt-get install fping" + run_cmd "sudo apt-get install i2c-tools" - run_cmd "pip3 install adafruit-circuitpython-lis3dh" - run_cmd "pip3 install adafruit-circuitpython-busdevice" - run_cmd "pip3 install adafruit-circuitpython-adxl34x" + run_cmd "pip3 install adafruit-circuitpython-ads1x15 --break-system-packages" + run_cmd "pip3 install adafruit-circuitpython-lis3dh --break-system-packages" + run_cmd "pip3 install adafruit-circuitpython-busdevice --break-system-packages" + run_cmd "pip3 install adafruit-circuitpython-adxl34x --break-system-packages" + run_cmd "pip3 install adafruit-circuitpython-mcp230xx --break-system-packages" - run_cmd "sudo pip3 install adafruit-circuitpython-mcp230xx" + run_cmd "pip3 install bme680 --break-system-packages" + run_cmd "pip3 install netaddr --break-system-packages" + + run_cmd "pip3 install board --break-system-packages" + run_cmd "pip3 install busio --break-system-packages" + + run_cmd "pip3 install digitalio --break-system-packages" + + run_cmd "pip3 install crontab --break-system-packages" + + # outdated + # run_cmd "sudo apt-get install python-dev python-smbus" + # run_cmd "sudo apt-get install build-essential git" +} + + +# Installation Python Module +install_python_modules() { + echo "Python Module für MariaDB, MQTT und Flask installieren ...." + + echo " ... mysql connector" + run_cmd "pip3 install mysql-connector-python --break-system-packages" + echo " ... mqtt connector" + run_cmd "pip3 install paho-mqtt==1.6.1 --break-system-packages" + echo " ... Flask Framework" + run_cmd "pip3 install Flask --break-system-packages" + + # Apache für Flask konfigurieren + # Apache wird der Proxy, jedoch muss /phpmyadmin weiterhin erreichbar bleiben + echo " ... Apache für Flask vorbereiten" + run_cmd "sudo a2enmod proxy" + run_cmd "sudo a2enmod proxy_http" + + # Füge ProxyPass zu 000-default.conf hinzu, um auf Flask-App zu verweisen + # und sicherzustellen, dass phpMyAdmin weiterhin funktioniert + run_cmd "echo \"\" | sudo tee /etc/apache2/sites-available/000-default.conf" + run_cmd "echo \" ServerAdmin webmaster@localhost\" | sudo tee -a /etc/apache2/sites-available/000-default.conf" + run_cmd "echo \" DocumentRoot /var/www/html\" | sudo tee -a /etc/apache2/sites-available/000-default.conf" + run_cmd "echo \" ProxyPass /phpmyadmin !\" | sudo tee -a /etc/apache2/sites-available/000-default.conf" + run_cmd "echo \" ProxyPass / http://127.0.0.1:5000/\" | sudo tee -a /etc/apache2/sites-available/000-default.conf" + run_cmd "echo \" ProxyPassReverse / http://127.0.0.1:5000/\" | sudo tee -a /etc/apache2/sites-available/000-default.conf" + run_cmd "echo \"\" | sudo tee -a /etc/apache2/sites-available/000-default.conf" + + echo "Flask als Systemdienst einrichten" + run_cmd "sudo cp $CARAVANPI_DIR/.systemd-files/flask.service /etc/systemd/system/" + run_cmd "sudo systemctl daemon-reload" + run_cmd "sudo systemctl enable flask.service" + run_cmd "sudo systemctl start flask.service" + + echo "Apache neu starten" + run_cmd "sudo service apache2 restart" + +} + +# Installation Backup Routinr +install_backup() { + echo "Backup Routine installieren ...." + + if [ -d "$RASPBERRY_PI_BACKUP_CLOUD_DIR" ]; then + # Routine beretis installiert + cd "$RASPBERRY_PI_BACKUP_CLOUD_DIR" + # Ermittle den aktuellen Branch + local current_branch=$(git rev-parse --abbrev-ref HEAD) + + echo + echo "Raspberry-Pi-Backup-Cloud Repository ist bereits auf diesem Gerät vorhanden." + echo "Lokal wird der Branch - $current_branch - benutzt. Dieser wird mit dem entsprechenden Branch auf github verglichen" + echo + read_colored "cyan" "Möchten Sie das Repository aktualisieren? (j/N): " answer + if [[ "$answer" =~ ^[Jj]$ ]]; then + cd "$RASPBERRY_PI_BACKUP_CLOUD_DIR" + echo "Prüfe Änderungen..." + git fetch + + local target_branch="master" + if [[ "$current_branch" == "development" ]]; then + target_branch="development" + fi + + local changes=$(git diff HEAD..origin/$target_branch) + + if [ -n "$changes" ]; then + "Änderungen verfügbar auf $target_branch Branch:" + git diff --stat HEAD..origin/$target_branch + echo + read_colored "cyan" "Möchten Sie diese Änderungen anwenden? (j/n): " apply_changes + if [[ "$apply_changes" =~ ^[Jj]$ ]]; then + echo "Aktualisiere Raspberry-Pi-Backup-Cloud Repository von $target_branch..." + run_cmd "git merge origin/$target_branch" + else + echo "Aktualisierung abgebrochen." + fi + else + echo "Keine Änderungen verfügbar. Repository ist aktuell." + fi + else + echo "Aktualisierung nicht gewünscht." + fi else - echo "Installation von Libraries übersprungen." + echo "Raspberry-Pi-Backup-Cloud Repository wird heruntergeladen..." + # Klonen des Repositories in den spezifizierten Branch + run_cmd "git clone https://github.com/spitzlbergerj/Raspberry-Pi-Backup-Cloud.git \"$RASPBERRY_PI_BACKUP_CLOUD_DIR\"" + run_cmd "cd \"$RASPBERRY_PI_BACKUP_CLOUD_DIR\"" + + # Ermittle die verfügbaren Branches vom Remote-Repository + # echo "Verfügbare Branches:" + # run_cmd "git branch" + + # nachfolgendes nur falls nicht nur simuliert (zu komplex für run_cmd) + # if [ "$SIMULATE" = false ]; then + # while true; do + # # Frage nach dem gewünschten Branch + # echo "Im Regelfall nutzen Sie bitte den main Branch!" + # read_colored "cyan" "Welchen Branch möchten Sie nutzen? (default: main)" target_branch + + # if [[ -z $target_branch ]]; then + # target_branch="main" + # fi + + # # Überprüfen, ob der eingegebene Branch existiert + # if git rev-parse --verify "$target_branch" > /dev/null 2>&1; then + # echo "Wechsle zu Branch '$target_branch'..." + # git checkout "$target_branch" + # break + # else + # echo "Der Branch '$target_branch' existiert nicht. Überprüfen Sie die Eingabe und versuchen Sie es erneut." + # echo + # fi + # done + # fi fi + + run_cmd "ln -s $RASPBERRY_PI_BACKUP_CLOUD_DIR/backup /home/pi/backup" + run_cmd "cp $CARAVANPI_DIR/.backup-config/backup2ndScript.sh /home/pi/backup/.config/backup2ndScript.sh" + run_cmd "cp $CARAVANPI_DIR/.backup-config/backup_dirs.txt /home/pi/backup/.config/backup_dirs.txt" + run_cmd "cp $CARAVANPI_DIR/.backup-config/backup_name.txt /home/pi/backup/.config/backup_name.txt" + run_cmd "cp $RASPBERRY_PI_BACKUP_CLOUD_DIR/backup/.config/rclone.conf-muster /home/pi/backup/.config/rclone.conf" + + run_cmd "chmod +x /home/pi/backup/backup.sh /home/pi/backup/.config/backup2ndScript.sh" + + # Installation von rclone + echo "Installation von rclone" + if [ "$SIMULATE" = false ]; then + curl https://rclone.org/install.sh | sudo bash + fi + + echo + echo_colored "magenta" "rclone muss noch zwingend konfiguriert werden." + echo_colored "magenta" "Eine Beschreibung hierzu finden Sie unter https://github.com/spitzlbergerj/Raspberry-Pi-Backup-Cloud" + echo + echo + } -# -------------------------------------------------------------------------------------- -# -------------------------------------------------------------------------------------- -# -# Skriptanfang -# -# -------------------------------------------------------------------------------------- -# -------------------------------------------------------------------------------------- +next_steps() { + + note "Abschluss und nächste Schritte" "cyan" + + echo + echo + echo_colored "magenta" "Sie haben es nun beinahe geschafft! Nun folgen noch manuelle Schritte" + echo + echo "- reboot durchführen" + echo " Sie sollten nach Abschluss der Installation einen reboot durchführen" + echo " Sie können sich diesen Text noch einmal ausgeben lassen, " + echo " wenn Sie dieses Installations-Skript noch einmal nur mit dem Paramter 'next' starten" + echo + echo "- rclone konfigurieren" + echo " Damit die Datensicherung klappt, müssen Sie noch rclone entsprechend konfigurieren" + echo " Eine gute Beschreibung hierfür finden Sie unter https://github.com/spitzlbergerj/Raspberry-Pi-Backup-Cloud" + echo + echo "- CaravanPi Konfiguration durchführen" + echo " Vieles am CaravanPi wird über eine Konfigruationsdatei gesteuert. Diese xml Datei können Sie komfortabel" + echo " über die CaravanPI Website befüllen. Gehen Sie dazu auf http://$ip_address/configs und führen Sie" + echo " nacheinander alle Konfigurationsschritte durch" + echo + echo "- Crontabs kontrollieren und anpassen" + echo " Dieses Skript hat für die Crontabs meine Muster Crontabs eingesetzt. Spätestens nach dem Booten werden" + echo " die CaravanPi Programme beginnen, die Sensoren abzufragen und in Datei, Datenbank zu schreiben" + echo " und an den MQTT Broker zu senden." + echo " Ändern Sie die Crontab nach Ihren Bedürfnissen. Nehmen Sie z.B. Programme außer Betrieb, falls noch" + echo " entsprechenden Sensoren verbaut wurden." + echo + echo + echo "- Sensoren in den Caravan einbauen und mit der CaravanPi Platine verbinden" + echo " Der letzte Schritt ist dann natürlich die Hardware Sensoren in den Caravan einzubauen" + echo " Auf dem CaravanPi Wiki finden Sie hierzu ausführliche Erläuterungen, wie ich das erledigt habe" + echo + echo +} + +# ######################################################################################## +# ######################################################################################## +# ## ## +# ## Skriptanfang ## +# ## ## +# ######################################################################################## +# ######################################################################################## + +# Wenn der Parameter next lautet, dann nur noch den Abschluss Text ausgeben +if [ "$p0" == "next" ]; then + next_steps + exit +fi if [ "$SIMULATE" = true ]; then - note "Kommandos werden NICHT ausgeführt, lediglich Simulation" "red" + note "Kommandos werden NICHT ausgeführt, lediglich Simulation" "green" else - note "ACHTUNG - Kommandos werden ausgeführt, keine Simulation" "red" + note "ACHTUNG - Kommandos werden ausgeführt !!! " "red" fi +cd "$HOME" + +echo "Die Installation von CaravanPi erfolgt in mehreren Schritten. Für das Funktionieren des CaravanPi sind alle Schritte vonnöten." +echo "Überspringen Sie Schritte nur, wenn Sie wissen was Sie tun bzw. wenn Sie nach einem erforderlichen Reboot alle Schritte " +echo "überspringen, die Sie schon ausgeführt haben." +echo +echo "Die Reihenfolge der einzelnen Schritte ist ebenfalls wichtig und einzuhalten." +echo +echo "Die einzelnen Kommados geben sehr viele Daten aus. Um die Übersicht zu erhöhen folge ich diesen Farb-Codex:" +echo_colored "cyan" "CYAN für Kapitelüberschriften und Abfragen an Sie" +echo_colored "magenta" "MAGENTA für wichtige Informationen" +echo +echo + # -------------------------------------------------------------------------- # Raspberry OS updaten # -------------------------------------------------------------------------- -note "Update Raspberry OS" +note "Update Raspberry OS" "cyan" -read -p "Möchten Sie Raspberry OS zunächst updaten? (j/N): " answer +read_colored "cyan" "Möchten Sie Raspberry OS zunächst updaten? (j/N): " answer if [[ "$answer" =~ ^[Jj]$ ]]; then update_raspberry_os + + echo "Überprüfe, ob ein Neustart erforderlich ist..." if [ -f /var/run/reboot-required ]; then - echo "Installationsskript wird beendet" + echo + echo + echo "Ein Neustart ist erforderlich, um die Aktualisierungen zu vervollständigen." + echo "Bitte führen Sie 'sudo reboot' aus." + echo "Anschließend starten Sie das Installationsskript erneut und überspringen die Sektionen bis Konfiguration Raspberry OS." + echo + echo + exit + else + echo "Kein Neustart erforderlich." fi -else - echo "Update Raspberry OS übersprungen." fi +cd "$HOME" + +# -------------------------------------------------------------------------- +# Raspberry OS konfigurieren +# -------------------------------------------------------------------------- +note "Konfiguration Raspberry OS" "cyan" + +echo "Die nachfolgenden Konfigurationen werden in der Regel vom Raspberry Pi Imager bereits vorgenommen." +echo +read_colored "cyan" "Möchten Sie Raspberry OS konfigurieren (Sprache, Zeitzone, Hostname, SSH, ...)? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + config_raspberry_os + + echo "Überprüfe, ob ein Neustart erforderlich ist..." + if [ -f /var/run/reboot-required ]; then + echo + echo + echo "Ein Neustart ist erforderlich, um die Aktualisierungen zu vervollständigen." + echo "Bitte führen Sie 'sudo reboot' aus." + echo "Anschließend starten Sie das Installationsskript erneut und überspringen die Sektionen bis Wifi." + echo + echo + exit + else + echo "Kein Neustart erforderlich." + fi +fi + +cd "$HOME" + +# -------------------------------------------------------------------------- +# WLAN konfigurieren (mehrere WLANs über eine Schleife) +# -------------------------------------------------------------------------- +note "Konfiguration Wifi - mehrere Eingaben möglich" "cyan" + +config_wifi + +cd "$HOME" + +# -------------------------------------------------------------------------- +# Raspberry OS erweitern +# -------------------------------------------------------------------------- +note "Konfiguration benötigter Kommunikationsprotokolle" "cyan" + +read_colored "cyan" "Möchten Sie die benötigten Kommunikationsprotokolle aktivieren (i2c, 1-wire, ...)? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + config_protocolls +fi + +cd "$HOME" + # -------------------------------------------------------------------------- # CaravanPi Repository installieren # -------------------------------------------------------------------------- -note "Installation CaravanPi Repository" +note "Installation CaravanPi Repository" "cyan" + +read_colored "cyan" "Möchten Sie das CaravanPi Repository von GitHub klonen? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_update_caravanpi +fi -install_update_caravanpi +cd "$HOME" # -------------------------------------------------------------------------- # MagicMirror installieren # -------------------------------------------------------------------------- -note "Installation MagicMirror" +note "Installation MagicMirror" "cyan" -install_magicmirror +read_colored "cyan" "Möchten Sie MagicMirror installieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_magicmirror + + echo + echo "Nachinstallieren des async Moduls von npm" + cd "$HOME/MagicMirror" + run_cmd "npm install async" + + echo + echo "Installieren einiger MagicMirror Module ... " + cd "$HOME/MagicMirror/modules" + echo " ... MMM-SimpleLogo für das CaravanPi Logo" + run_cmd "git clone https://github.com/frdteknikelektro/MMM-SimpleLogo.git" + cd MMM-SimpleLogo + run_cmd "npm install" + run_cmd "cp $HOME/CaravanPi/images/CaravanPi-Logo-weiss.png ~/MagicMirror/modules/MMM-SimpleLogo/public/CaravanPi-Logo-weiss.png" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-Remote-Control um den MagicMirror per Website konfigurieren zu können" + run_cmd "git clone https://github.com/Jopyth/MMM-Remote-Control" + cd MMM-Remote-Control + run_cmd "npm install" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-MarineWeather als Wetteranzeige" + run_cmd "git clone https://github.com/grenagit/MMM-MarineWeather" + cd MMM-MarineWeather + run_cmd "npm install" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-Sunrise-Sunset" + run_cmd "git clone https://github.com/prydonian/MMM-Sunrise-Sunset" + cd MMM-Sunrise-Sunset + run_cmd "npm install" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-CaravanPi Module" + echo " ... MMM-CaravanPiTemperature" + run_cmd "git clone https://github.com/spitzlbergerj/MMM-CaravanPiTemperature" + cd MMM-CaravanPiTemperature + run_cmd "npm install" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-CaravanPiGasWeight" + run_cmd "git clone https://github.com/spitzlbergerj/MMM-CaravanPiGasWeight" + cd MMM-CaravanPiGasWeight + run_cmd "npm install" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-CaravanPiClimate" + run_cmd "git clone https://github.com/spitzlbergerj/MMM-CaravanPiClimate" + cd MMM-CaravanPiClimate + run_cmd "npm install" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-CaravanPiPosition" + run_cmd "git clone https://github.com/spitzlbergerj/MMM-CaravanPiPosition" + cd MMM-CaravanPiPosition + run_cmd "npm install" + + cd "$HOME/MagicMirror/modules" + echo " ... MMM-GrafanaEmbedded zum Anzeigen der Grafana Grafen" + run_cmd "git clone https://github.com/eirikaho/MMM-GrafanaEmbedded.git" + + echo "Kopieren der CaravanPi config.js und der custom.css ..." + run_cmd "cp -f $HOME/CaravanPi/MagicMirror/config/config.js $HOME/MagicMirror/config" + run_cmd "cp -f $HOME/CaravanPi/MagicMirror/css/custom.css $HOME/MagicMirror/css" + + + echo "Starten des MagicMirror" + run_cmd "pm2 start MagicMirror" + + echo + echo_colored "magenta" "MagicMirror sollte nun in Kürze auf Ihrem Bildschirm erscheinen" + echo + +fi + +cd "$HOME" # -------------------------------------------------------------------------- # Apache Webserver installieren # -------------------------------------------------------------------------- -note "Installation Apache Webserver" +note "Installation Apache Webserver" "cyan" -install_apache +read_colored "cyan" "Möchten Sie den Apache Webserver installieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_apache + + echo + echo_colored "magenta" "Sie sollten nun auf die Website Ihres CaravanPi zugreifen können." + echo "Rufen Sie dazu die Website http://$ip_address/ auf." + echo + +fi + +cd "$HOME" # -------------------------------------------------------------------------- # MariaDB installieren # -------------------------------------------------------------------------- -note "Installation MariaDB" +note "Installation MariaDB" "cyan" + +read_colored "cyan" "Möchten Sie MariaDB installieren und alle Tabellen anlegen? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_mariadb + + echo + echo_colored "magenta" "Nach der Installation von phpmyadmin wird die MariaDB noch abgesichert" + echo +fi + +cd "$HOME" -install_mariadb # -------------------------------------------------------------------------- # phpmyadmin installieren # -------------------------------------------------------------------------- -note "Installation phpmyadmin" +note "Installation phpmyadmin" "cyan" + +read_colored "cyan" "Möchten Sie phpmyadmin installieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_phpmyadmin + + echo + echo_colored "magenta" "Sie sollten nun auf phpMyAdmin und damit die Datenbank zugreifen können." + echo "Rufen Sie dazu die Website http://$ip_address/phpmyadmin auf." + echo + +fi + +cd "$HOME" + +# -------------------------------------------------------------------------- +# MariaDB absichern +# -------------------------------------------------------------------------- +note "MariaDB absichern" "cyan" + +read_colored "cyan" "Möchten Sie die MariaDB absichern? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + secure_mariadb +fi -install_phpmyadmin +cd "$HOME" # -------------------------------------------------------------------------- # Grafana installieren # -------------------------------------------------------------------------- -note "Installation Grafana" +note "Installation Grafana" "cyan" -install_grafana +read_colored "cyan" "Möchten Sie Grafana installieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_grafana + + echo + echo_colored "magenta" "Sie sollten nun auf Grafana zugreifen können." + echo "Rufen Sie dazu die Website http://$ip_address:3000 auf." + echo + +fi + +cd "$HOME" + +# -------------------------------------------------------------------------- +# diverse Libraries installieren +# -------------------------------------------------------------------------- +note "Installation diverser Libraries" "cyan" + +read_colored "cyan" "Möchten Sie die notwendigen Libraries installieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_libraries +fi + +cd "$HOME" # -------------------------------------------------------------------------- # Python Module installieren # -------------------------------------------------------------------------- -note "Installation Python Module" +note "Installation Python Module für MariaDB, MQTT und Flask" "cyan" + +read_colored "cyan" "Möchten Sie die Python Module installieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_python_modules + + echo + echo_colored "magenta" "Sie sollten nun auf die CaravanPi Bedienungs-Website zugreifen können." + echo "Rufen Sie dazu jetzt erneut die Website http://$ip_address auf." + echo + echo_colored "magenta" "Sie können dort bereits jetzt den bisherigen Installationsstatus einsehen." + echo "Klicken Sie dazu auf den Button 'Status'" + echo "Achtung: Sie werden dabei vermutlich einen Fehler bei der MariaDB bekommen." + echo "Dies liegt daran, dass Sie in der CaravanPi Konfiguration die User Daten noch nicht gesetzt haben." + echo "Rufen Sie hierzu folgende Seite auf: http://$ip_address/config_caravanpi" + +fi + +cd "$HOME" + +# -------------------------------------------------------------------------- +# Backup Routine clonen und einrichten +# -------------------------------------------------------------------------- +note "Backup Routine installieren" "cyan" + +read_colored "cyan" "Möchten Sie die Backup Routine installieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + install_backup +fi + +cd "$HOME" + +# -------------------------------------------------------------------------- +# Bewegungsssensor aktivieren +# -------------------------------------------------------------------------- +note "Bewegungssernsor aktivieren" "cyan" + +read_colored "cyan" "Möchten Sie den Bewegungssensor aktivieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + + echo "PIR Sensor als Systemdienst einrichten" + run_cmd "sudo cp $CARAVANPI_DIR/.systemd-files/pir.service /etc/systemd/system/" + run_cmd "sudo systemctl daemon-reload" + run_cmd "sudo systemctl enable pir.service" + run_cmd "sudo systemctl start pir.service" +fi + +cd "$HOME" -install_python_modules + +# -------------------------------------------------------------------------- +# logrotate einrichten +# -------------------------------------------------------------------------- +note "Logrotate konfigurieren" "cyan" + +read_colored "cyan" "Möchten Sie logrotate für CaravanPi aktivieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + run_cmd "echo -e \"\n# CaravanPi\ninclude /home/pi/CaravanPi/logrotate/logrotate-CaravanPi.conf\" | sudo tee -a /etc/logrotate.conf > /dev/null" + run_cmd "sudo find \"$CARAVANPI_DIR\" -type f -name \"*logrotate*.conf\" -exec chown root:root {} \;" +fi + +cd "$HOME" + +# -------------------------------------------------------------------------- +# Crontabs +# -------------------------------------------------------------------------- +note "Crontabs einrichten" "cyan" + +read_colored "cyan" "Möchten Sie die Crontabs von pi und root aktivieren? (j/N): " answer +if [[ "$answer" =~ ^[Jj]$ ]]; then + run_cmd "crontab $CARAVANPI_DIR/.crontabs/crontab-pi" + run_cmd "sudo crontab $CARAVANPI_DIR/.crontabs/crontab-root" +fi + +cd "$HOME" # -------------------------------------------------------------------------- # CaravanPi Config Lib initialisieren und damit ggf. defaults konvertieren # -------------------------------------------------------------------------- -note "CaravanPi Library initialisieren und ggf. defaults konvertieren" +note "CaravanPi Library initialisieren und ggf. defaults konvertieren" "cyan" python3 $CARAVANPI_DIR/installation/caravanPiLibInit.py + +cd "$HOME" + +# -------------------------------------------------------------------------- +# nächste Schritte +# -------------------------------------------------------------------------- + +next_steps