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