diff --git a/.conf/desktop/apps/opentyrian.desktop b/.conf/desktop/apps/opentyrian.desktop index c09b7d95fc..4d2d0efa7a 100644 --- a/.conf/desktop/apps/opentyrian.desktop +++ b/.conf/desktop/apps/opentyrian.desktop @@ -2,7 +2,7 @@ Type=Application Name=OpenTyrian Comment=An arcade-style shoot 'em up -Icon=/usr/local/games/opentyrian/linux/icons/tyrian-48.png +Icon=/usr/games/opentyrian/linux/icons/tyrian-48.png Categories=Game;ArcadeGame; -Exec=/usr/local/games/opentyrian/run +Exec=/usr/games/opentyrian/run Terminal=false diff --git a/.conf/desktop/lxqt/lxqt-buster.7z b/.conf/desktop/lxqt/lxqt-buster.7z new file mode 100644 index 0000000000..2c55cd37a7 Binary files /dev/null and b/.conf/desktop/lxqt/lxqt-buster.7z differ diff --git a/.conf/desktop/lxqt/lxqt-stretch.7z b/.conf/desktop/lxqt/lxqt-stretch.7z new file mode 100644 index 0000000000..119d1045a9 Binary files /dev/null and b/.conf/desktop/lxqt/lxqt-stretch.7z differ diff --git a/.conf/dps_114/apache.nextcloud.conf b/.conf/dps_114/apache.nextcloud.conf index 6d6e8e33fe..2f6d842044 100644 --- a/.conf/dps_114/apache.nextcloud.conf +++ b/.conf/dps_114/apache.nextcloud.conf @@ -15,7 +15,4 @@ Redirect permanent /ocs-provider /nextcloud/ocs-provider SetEnv HOME /var/www/nextcloud SetEnv HTTP_HOME /var/www/nextcloud - # Hard coding 128M OPCache size, only for /nextcloud, to suppress warning on nextcloud admin panel. - php_admin_value opcache.memory_consumption 128 - diff --git a/.conf/dps_114/lighttpd.nextcloud.conf b/.conf/dps_114/lighttpd.nextcloud.conf index 489d1862a5..e3b242844e 100644 --- a/.conf/dps_114/lighttpd.nextcloud.conf +++ b/.conf/dps_114/lighttpd.nextcloud.conf @@ -30,7 +30,4 @@ $HTTP["url"] =~ "^/nextcloud($|/)" { ) } - # Solve OPcache settings warning on Nextcloud admin panel - setenv.add-environment += ( "PHP_ADMIN_VALUE" => "opcache.memory_consumption=128" ) - } diff --git a/.conf/dps_114/nginx.nextcloud.conf b/.conf/dps_114/nginx.nextcloud.conf index 057e9f4742..b9081fac72 100644 --- a/.conf/dps_114/nginx.nextcloud.conf +++ b/.conf/dps_114/nginx.nextcloud.conf @@ -60,8 +60,6 @@ location ^~ /nextcloud { fastcgi_intercept_errors on; # Disable on Jessie, because Jessie Nginx does not support this directive #fastcgi_request_buffering off; - # Hard coding 128M OPCache size to suppress warning on Nextcloud admin panel. - fastcgi_param PHP_ADMIN_VALUE "opcache.memory_consumption=128"; } location ~ ^\/nextcloud\/(?:updater|ocs-provider|ocm-provider)(?:$|\/) { diff --git a/.conf/dps_121/roonbridge.service b/.conf/dps_121/roonbridge.service index 531b1091a9..111937a921 100644 --- a/.conf/dps_121/roonbridge.service +++ b/.conf/dps_121/roonbridge.service @@ -1,10 +1,8 @@ [Unit] -Description=Roon Bridge +Description=Roon Bridge (DietPi) After=network.target sound.target [Service] -Type=simple -User=root Group=dietpi Environment=ROON_DATAROOT=/mnt/dietpi_userdata/roon Environment=ROON_ID_DIR=/mnt/dietpi_userdata/roon diff --git a/.conf/dps_36/squeezelite.service b/.conf/dps_36/squeezelite.service index e4fc683d62..9971e7a702 100644 --- a/.conf/dps_36/squeezelite.service +++ b/.conf/dps_36/squeezelite.service @@ -1,8 +1,7 @@ [Unit] -Description=squeezelite +Description=SqueezeLite (DietPi) [Service] -Type=simple ExecStart=/usr/bin/squeezelite -a 4096:1024:16:0 -C 5 -n 'DietPi-Squeezelite' -f /var/log/squeezelite.log [Install] diff --git a/.conf/dps_51/run b/.conf/dps_51/run index 9f439918ae..3a6f1533f1 100644 --- a/.conf/dps_51/run +++ b/.conf/dps_51/run @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/dash #//////////////////////////////////// # DietPi OpenTyrian Run Script # @@ -12,15 +12,16 @@ # Usage: # run #//////////////////////////////////// +FP_DIR='/usr/games/opentyrian' -#Xserver already running -if (($(pidof X) >= 0)); then +# Xserver already running +if pgrep Xorg &> /dev/null; then - /usr/local/games/opentyrian/opentyrian -t /usr/local/games/opentyrian/data + $FP_DIR/opentyrian -t $FP_DIR/data -#No X (init X server) +# No X (init X server) else - xinit /usr/local/games/opentyrian/opentyrian -t /usr/local/games/opentyrian/data + xinit $FP_DIR/opentyrian -t $FP_DIR/data fi diff --git a/.conf/dps_85/nginx.conf b/.conf/dps_85/nginx.conf index 863d8e8b48..b6cabc61f7 100644 --- a/.conf/dps_85/nginx.conf +++ b/.conf/dps_85/nginx.conf @@ -30,7 +30,7 @@ http { # Upstream to abstract back-end connection(s) for PHP upstream php { - server unix:/run/php/php7.0-fpm.sock; + server unix:/run/php/php7.3-fpm.sock; } # Set the mime-types via the mime.types external file @@ -42,7 +42,7 @@ http { # Click tracking! access_log off; - # Hide nginx version + # Hide Nginx version server_tokens off; # ~2 seconds is often enough for HTML/CSS, but connections in diff --git a/.meta/dietpi-cloud-migration b/.meta/dietpi-cloud-migration index 992fe4e9fd..cb07eddffd 100644 --- a/.meta/dietpi-cloud-migration +++ b/.meta/dietpi-cloud-migration @@ -1,17 +1,20 @@ #!/bin/bash -(( $UID )) && echo -e '[\e[31mFAILED\e[0m] Root privileges required. Please run the script with "sudo".\n' && exit 1 +(( $UID )) && echo -e '[\e[31mFAILED\e[0m] Root privileges required. Please run the script with "sudo".' && exit 1 echo -e '[\e[32m OK \e[0m] Root privileges verified.' -! apt-get install -y rsync && echo -e '[\e[31mFAILED\e[0m] "rsync" install failed. Please check your internet connection, proper apt-get function or try to install it manually: "apt-get install -y rsync"\n' && exit 1 +! apt-get install -y rsync && echo -e '[\e[31mFAILED\e[0m] "rsync" install failed. Please check your internet connection, proper apt-get function or try to install it manually: "apt install rsync"' && exit 1 echo -e '[\e[32m OK \e[0m] Successfully installed rsync.' +systemctl start mariadb &> /dev/null || systemctl start mysql &> /dev/null || { echo -e '[\e[31mFAILED\e[0m] Could not start MariaDB server. Aborting...'; exit 1; } +echo -e '[\e[32m OK \e[0m] Successfully started MariaDB.' + run_backup(){ fp_config="/var/www/$1/config/config.php" echo '[ INFO ] Enabling maintenance mode...' - ! sudo -u www-data php /var/www/$1/occ maintenance:mode --on && echo -e '[\e[31mFAILED\e[0m] Could not enable maintenance mode, please check running state of your instance and PHP functionality.\n' && exit 1 + ! sudo -u www-data php /var/www/$1/occ maintenance:mode --on && echo -e '[\e[31mFAILED\e[0m] Could not enable maintenance mode, please check running state of your instance and PHP functionality.' && exit 1 echo "[ INFO ] Scanning $fp_config for necessary information..." local fp_datadir=$(grep -m1 "^[[:blank:]]*'datadirectory'" $fp_config | cut -d \' -f 4) @@ -26,19 +29,19 @@ run_backup(){ - database password: $dbpass" echo '[ INFO ] Backup database to data directory...' - ! mysqldump -u"$dbuser" -h"$dbhost" -p"$dbpass" "$dbname" > "$fp_datadir"/dietpi-$1-database-backup.sql && echo -e '[\e[31mFAILED\e[0m] Database backup failed, please check state of your database server, check logs and in case repair table corruptions.\n' && exit 1 + ! mysqldump -u"$dbuser" -h"$dbhost" -p"$dbpass" "$dbname" > "$fp_datadir"/dietpi-$1-database-backup.sql && echo -e '[\e[31mFAILED\e[0m] Database backup failed, please check state of your database server, check logs and in case repair table corruptions.' && exit 1 echo -e "[\e[32m OK \e[0m] Successfully finished database backup to: $fp_datadir/dietpi-$1-database-backup.sql" echo '[ INFO ] Backup installation folder to data directory...' - ! rsync -aHp --delete /var/www/$1/ "$fp_datadir"/dietpi-$1-installation-backup && echo -e '[\e[31mFAILED\e[0m] "rsync" failed, please check for error reasons and try again.\n' && exit 1 + ! rsync -aHp --delete /var/www/$1/ "$fp_datadir"/dietpi-$1-installation-backup && echo -e '[\e[31mFAILED\e[0m] "rsync" failed, please check for error reasons and try again.' && exit 1 echo -e "[\e[32m OK \e[0m] Successfully finished installation backup to: $fp_datadir/dietpi-$1-installation-backup/" if [[ $2 ]]; then echo '[ INFO ] You provided an additional backup location. Moving data directory...' - [[ ! -d $2 ]] && echo -e "[\e[31mFAILED\e[0m] $2 is no existing directory, please check spelling and mount status of your desired backup drive.\n" && exit 1 + [[ ! -d $2 ]] && echo -e "[\e[31mFAILED\e[0m] $2 is no existing directory, please check spelling and mount status of your desired backup drive." && exit 1 - ! rsync -aHp --delete "$fp_datadir"/ "$2" && echo -e '[\e[31mFAILED\e[0m] "rsync" failed, please check for error reasons and try again.\n' && exit 1 + ! rsync -aHp --delete "$fp_datadir"/ "$2" && echo -e '[\e[31mFAILED\e[0m] "rsync" failed, please check for error reasons and try again.' && exit 1 echo -e "[\e[32m OK \e[0m] Successfully synced data directory to: $2" else @@ -53,18 +56,20 @@ run_backup(){ ### MAIN ### -if [[ -f /var/www/owncloud/config/config.php ]]; then +if [[ -f '/var/www/owncloud/config/config.php' ]]; then echo '[ INFO ] ownCloud installation found, preparing backup...' run_backup owncloud "$1" fi -if [[ -f /var/www/nextcloud/config/config.php ]]; then +if [[ -f '/var/www/nextcloud/config/config.php' ]]; then echo '[ INFO ] Nextcloud installation found, preparing backup...' run_backup nextcloud "$1" fi -[[ ! $fp_config ]] && echo -e '[\e[31mFAILED\e[0m] No ownCloud or Nextcloud instance found at /var/www/owncloud|nextcloud. Aborting...\n' && exit 1 +[[ ! $fp_config ]] && echo -e '[\e[31mFAILED\e[0m] No ownCloud or Nextcloud instance found at /var/www/owncloud|nextcloud. Aborting...' && exit 1 + +exit 0 diff --git a/.meta/dietpi-survey_report b/.meta/dietpi-survey_report index 52a1862581..68a81f61cb 100644 --- a/.meta/dietpi-survey_report +++ b/.meta/dietpi-survey_report @@ -18,6 +18,7 @@ aHW_NAME[12]='Odroid C2' aHW_NAME[13]='Odroid U3' aHW_NAME[14]='Odroid N1' + aHW_NAME[15]='Odroid N2' aHW_NAME[20]='VM x64 (VMware VirtualBox)' aHW_NAME[21]='x86_64 native (PC)' aHW_NAME[22]='Generic device (eg: unknown to DietPi)' @@ -53,13 +54,15 @@ aHW_NAME[70]='Sparky SBC' aHW_NAME[71]='Beagle Bone Black' - aBENCH_COMMON_INDEX=() - + # - Core Benchmarks + aBENCH_CPU_INDEX=() + aBENCH_RAM_INDEX=() + aBENCH_ROOTFS_INDEX=() # - Optional benchmarks aBENCH_LAN_INDEX=() aBENCH_CUSTOMFS_INDEX=() - #[$HW_MODEL,${aBENCH_COMMON_INDEX[$HW_MODEL]}] + #[$HW_MODEL,${aBENCH_XX_INDEX[$HW_MODEL]}] declare -A aBENCH_CPU declare -A aBENCH_ROOTFS_WRITE declare -A aBENCH_ROOTFS_READ @@ -74,7 +77,7 @@ declare -A aBENCH_NET_LAN_SPEED #Results - BENCH_RESULTS_CPU_SCALE=2 + BENCH_RESULTS_CPU_SCALE=1 aBENCH_RESULT_CPU_MIN=() aBENCH_RESULT_CPU_MAX=() aBENCH_RESULT_CPU_AVG=() @@ -376,14 +379,21 @@ aSOFTWARE_NAME6_20[171]='DietPi-NordVPN' aSOFTWARE_NAME6_20[172]='WireGuard' - # - v6.21 + v6.22 + # - v6.21 + v6.22 + v6.23 + aSOFTWARE_NAME6_21=() + aSOFTWARE_NAME6_22=() + aSOFTWARE_NAME6_23=() for i in ${!aSOFTWARE_NAME6_20[@]} do aSOFTWARE_NAME6_21[$i]=${aSOFTWARE_NAME6_20[$i]} aSOFTWARE_NAME6_22[$i]=${aSOFTWARE_NAME6_21[$i]} + aSOFTWARE_NAME6_23[$i]=${aSOFTWARE_NAME6_22[$i]} done + aSOFTWARE_NAME6_23[173]='LXQt' + aSOFTWARE_NAME6_23[174]='GIMP' + aSOFTWARE_NAME6_23[175]='XFCE Power Manager' Main(){ @@ -416,36 +426,56 @@ if [[ $G_DEBUG == 1 ]]; then - echo "DEBUG Benchmark: $file" - echo "BENCH_VERSION=$BENCH_VERSION | BENCH_HW_MODEL=$BENCH_HW_MODEL BENCH_CPU=$BENCH_CPU | BENCH_ROOTFS_WRITE=$BENCH_ROOTFS_WRITE | BENCH_ROOTFS_READ=$BENCH_ROOTFS_READ | BENCH_RAM_WRITE=$BENCH_RAM_WRITE | BENCH_RAM_READ=$BENCH_RAM_READ | BENCH_CPU_TEMP_START=$BENCH_CPU_TEMP_START | BENCH_CPU_TEMP_END=$BENCH_CPU_TEMP_END | BENCH_CUSTOMFS_WRITE=$BENCH_CUSTOMFS_WRITE | BENCH_CUSTOMFS_READ=$BENCH_CUSTOMFS_READ | BENCH_NET_LAN_SPEED=$BENCH_NET_LAN_SPEED" + echo "DEBUG $file: BENCH_VERSION=$BENCH_VERSION | BENCH_HW_MODEL=$BENCH_HW_MODEL BENCH_CPU=$BENCH_CPU | BENCH_ROOTFS_WRITE=$BENCH_ROOTFS_WRITE | BENCH_ROOTFS_READ=$BENCH_ROOTFS_READ | BENCH_RAM_WRITE=$BENCH_RAM_WRITE | BENCH_RAM_READ=$BENCH_RAM_READ | BENCH_CPU_TEMP_START=$BENCH_CPU_TEMP_START | BENCH_CPU_TEMP_END=$BENCH_CPU_TEMP_END | BENCH_CUSTOMFS_WRITE=$BENCH_CUSTOMFS_WRITE | BENCH_CUSTOMFS_READ=$BENCH_CUSTOMFS_READ | BENCH_NET_LAN_SPEED=$BENCH_NET_LAN_SPEED" fi - #Common benchmarks - # - Check for all expected values based on how we handle them, only add entry if valid for all. + # - CPU if [[ ${BENCH_CPU//.*} =~ ^-?[0-9]+$ && - ${BENCH_ROOTFS_WRITE//.*} =~ ^-?[0-9]+$ && ${BENCH_ROOTFS_READ//.*} =~ ^-?[0-9]+$ && - ${BENCH_RAM_WRITE//.*} =~ ^-?[0-9]+$ && ${BENCH_RAM_READ//.*} =~ ^-?[0-9]+$ && - $BENCH_CPU_TEMP_START && $BENCH_CPU_TEMP_END ]]; then + $BENCH_CPU_TEMP_START =~ ^-?[0-9]+$ && $BENCH_CPU_TEMP_END =~ ^-?[0-9]+$ ]]; then + + aBENCH_CPU[$BENCH_HW_MODEL,${aBENCH_CPU_INDEX[$BENCH_HW_MODEL]:=0}]=$BENCH_CPU + + # - Patch for 5 digit CPU temp's: https://github.com/MichaIng/DietPi/issues/2715 + (( ${BENCH_CPU_TEMP_START//.*} > 130 )) && (( BENCH_CPU_TEMP_START /= 1000 )) + (( ${BENCH_CPU_TEMP_END//.*} > 130 )) && (( BENCH_CPU_TEMP_END /= 1000 )) + # ------------------------------------------------------------------------------ + + aBENCH_CPU_TEMP_START[$BENCH_HW_MODEL,${aBENCH_CPU_INDEX[$BENCH_HW_MODEL]}]=${BENCH_CPU_TEMP_START//.*} + aBENCH_CPU_TEMP_END[$BENCH_HW_MODEL,${aBENCH_CPU_INDEX[$BENCH_HW_MODEL]}]=${BENCH_CPU_TEMP_END//.*} + + ((aBENCH_CPU_INDEX[$BENCH_HW_MODEL]++)) + + fi + + # - RootFS + if [[ ${BENCH_ROOTFS_WRITE//.*} =~ ^-?[0-9]+$ && ${BENCH_ROOTFS_READ//.*} =~ ^-?[0-9]+$ ]]; then + + aBENCH_ROOTFS_WRITE[$BENCH_HW_MODEL,${aBENCH_ROOTFS_INDEX[$BENCH_HW_MODEL]:=0}]=${BENCH_ROOTFS_WRITE//.*} + aBENCH_ROOTFS_READ[$BENCH_HW_MODEL,${aBENCH_ROOTFS_INDEX[$BENCH_HW_MODEL]}]=${BENCH_ROOTFS_READ//.*} + + ((aBENCH_ROOTFS_INDEX[$BENCH_HW_MODEL]++)) + + fi - aBENCH_CPU[$BENCH_HW_MODEL,${aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]:=0}]=$BENCH_CPU - aBENCH_ROOTFS_WRITE[$BENCH_HW_MODEL,${aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]}]=${BENCH_ROOTFS_WRITE//.*} - aBENCH_ROOTFS_READ[$BENCH_HW_MODEL,${aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]}]=${BENCH_ROOTFS_READ//.*} - aBENCH_RAM_WRITE[$BENCH_HW_MODEL,${aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]}]=${BENCH_RAM_WRITE//.*} - aBENCH_RAM_READ[$BENCH_HW_MODEL,${aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]}]=${BENCH_RAM_READ//.*} - aBENCH_CPU_TEMP_START[$BENCH_HW_MODEL,${aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]}]=${BENCH_CPU_TEMP_START//.*} - aBENCH_CPU_TEMP_END[$BENCH_HW_MODEL,${aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]}]=${BENCH_CPU_TEMP_END//.*} + # - RAM + # - https://github.com/MichaIng/DietPi/issues/2715 | nullify this score and ignore it in min/max/avg processing. + if (( $BENCH_VERSION >= 2 )) && + [[ ${BENCH_RAM_WRITE//.*} =~ ^-?[0-9]+$ && ${BENCH_RAM_READ//.*} =~ ^-?[0-9]+$ ]]; then - ((aBENCH_COMMON_INDEX[$BENCH_HW_MODEL]++)) + aBENCH_RAM_WRITE[$BENCH_HW_MODEL,${aBENCH_RAM_INDEX[$BENCH_HW_MODEL]:=0}]=${BENCH_RAM_WRITE//.*} + aBENCH_RAM_READ[$BENCH_HW_MODEL,${aBENCH_RAM_INDEX[$BENCH_HW_MODEL]}]=${BENCH_RAM_READ//.*} + + ((aBENCH_RAM_INDEX[$BENCH_HW_MODEL]++)) fi - #Optional benchmarks, handle them in a seperate index array # - Custom FS if [[ ${BENCH_CUSTOMFS_WRITE//.*} =~ ^-?[0-9]+$ && ${BENCH_CUSTOMFS_READ//.*} =~ ^-?[0-9]+$ ]]; then aBENCH_CUSTOMFS_WRITE[$BENCH_HW_MODEL,${aBENCH_CUSTOMFS_INDEX[$BENCH_HW_MODEL]:=0}]=${BENCH_CUSTOMFS_WRITE//.*} - aBENCH_CUSTOMFS_READ[$BENCH_HW_MODEL,${aBENCH_CUSTOMFS_INDEX[$BENCH_HW_MODEL]}]=${BENCH_CUSTOMFS_READ//.*} + aBENCH_CUSTOMFS_READ[$BENCH_HW_MODEL,${aBENCH_CUSTOMFS_INDEX[$BENCH_HW_MODEL]:=0}]=${BENCH_CUSTOMFS_READ//.*} + ((aBENCH_CUSTOMFS_INDEX[$BENCH_HW_MODEL]++)) fi @@ -454,6 +484,7 @@ if [[ ${BENCH_NET_LAN_SPEED//.*} =~ ^-?[0-9]+$ ]]; then aBENCH_NET_LAN_SPEED[$BENCH_HW_MODEL,${aBENCH_LAN_INDEX[$BENCH_HW_MODEL]:=0}]=${BENCH_NET_LAN_SPEED//.*} + ((aBENCH_LAN_INDEX[$BENCH_HW_MODEL]++)) fi @@ -484,34 +515,18 @@ # Clean up reports dir rm -R /tmp/dietpi-survey_report - #Bench Results, HW_MODEL array: + #Process all results, for later use in HTML printout + # - NB: HW_MODEL array based local default_min_value=100000 - for i in ${!aBENCH_COMMON_INDEX[@]} - do - local hw_model_supports_cpu_temps=1 + # - CPU + for i in ${!aBENCH_CPU_INDEX[@]} + do - #init results aBENCH_RESULT_CPU_MIN[$i]=$default_min_value aBENCH_RESULT_CPU_MAX[$i]=0 aBENCH_RESULT_CPU_AVG[$i]=0 - aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]=$default_min_value - aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]=0 - aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]=0 - - aBENCH_RESULT_ROOTFS_READ_MIN[$i]=$default_min_value - aBENCH_RESULT_ROOTFS_READ_MAX[$i]=0 - aBENCH_RESULT_ROOTFS_READ_AVG[$i]=0 - - aBENCH_RESULT_RAM_WRITE_MIN[$i]=$default_min_value - aBENCH_RESULT_RAM_WRITE_MAX[$i]=0 - aBENCH_RESULT_RAM_WRITE_AVG[$i]=0 - - aBENCH_RESULT_RAM_READ_MIN[$i]=$default_min_value - aBENCH_RESULT_RAM_READ_MAX[$i]=0 - aBENCH_RESULT_RAM_READ_AVG[$i]=0 - aBENCH_RESULT_CPU_TEMP_START_MIN[$i]=$default_min_value aBENCH_RESULT_CPU_TEMP_START_MAX[$i]=0 aBENCH_RESULT_CPU_TEMP_START_AVG[$i]=0 @@ -520,162 +535,176 @@ aBENCH_RESULT_CPU_TEMP_END_MAX[$i]=0 aBENCH_RESULT_CPU_TEMP_END_AVG[$i]=0 - for (( j=0; j<${aBENCH_COMMON_INDEX[$i]}; j++ )) + for (( j=0; j<${aBENCH_CPU_INDEX[$i]}; j++ )) do - #CPU # echo "aBENCH_CPU[$i,$j] ${aBENCH_CPU[$i,$j]}" if (( $(bc -l <<< "${aBENCH_CPU[$i,$j]} < ${aBENCH_RESULT_CPU_MIN[$i]}") )); then - aBENCH_RESULT_CPU_MIN[$i]=$(bc -l <<< "scale=$BENCH_RESULTS_CPU_SCALE; ${aBENCH_CPU[$i,$j]} * 1") + aBENCH_RESULT_CPU_MIN[$i]=$(bc -l <<< "scale=$BENCH_RESULTS_CPU_SCALE; ${aBENCH_CPU[$i,$j]} / 1") fi if (( $(bc -l <<< "${aBENCH_CPU[$i,$j]} > ${aBENCH_RESULT_CPU_MAX[$i]}") )); then - aBENCH_RESULT_CPU_MAX[$i]=$(bc -l <<< "scale=$BENCH_RESULTS_CPU_SCALE; ${aBENCH_CPU[$i,$j]} * 1") + aBENCH_RESULT_CPU_MAX[$i]=$(bc -l <<< "scale=$BENCH_RESULTS_CPU_SCALE; ${aBENCH_CPU[$i,$j]} / 1") fi aBENCH_RESULT_CPU_AVG[$i]=$(bc -l <<< "${aBENCH_CPU[$i,$j]} + ${aBENCH_RESULT_CPU_AVG[$i]}") - #RootFS - # echo "aBENCH_ROOTFS_WRITE[$i,$j] ${aBENCH_ROOTFS_WRITE[$i,$j]}" - if (( ${aBENCH_ROOTFS_WRITE[$i,$j]} < ${aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]} )); then + if (( ${aBENCH_CPU_TEMP_START[$i,$j]} < ${aBENCH_RESULT_CPU_TEMP_START_MIN[$i]} )); then - aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]=${aBENCH_ROOTFS_WRITE[$i,$j]} + aBENCH_RESULT_CPU_TEMP_START_MIN[$i]=${aBENCH_CPU_TEMP_START[$i,$j]} fi - if (( ${aBENCH_ROOTFS_WRITE[$i,$j]} > ${aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]} )); then + if (( ${aBENCH_CPU_TEMP_START[$i,$j]} > ${aBENCH_RESULT_CPU_TEMP_START_MAX[$i]} )); then - aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]=${aBENCH_ROOTFS_WRITE[$i,$j]} + aBENCH_RESULT_CPU_TEMP_START_MAX[$i]=${aBENCH_CPU_TEMP_START[$i,$j]} fi - (( aBENCH_RESULT_ROOTFS_WRITE_AVG[$i] += ${aBENCH_ROOTFS_WRITE[$i,$j]} )) + (( aBENCH_RESULT_CPU_TEMP_START_AVG[$i] += ${aBENCH_CPU_TEMP_START[$i,$j]} )) - # echo "aBENCH_ROOTFS_READ[$i,$j] ${aBENCH_ROOTFS_READ[$i,$j]}" - if (( ${aBENCH_ROOTFS_READ[$i,$j]} < ${aBENCH_RESULT_ROOTFS_READ_MIN[$i]} )); then + # echo "aBENCH_CPU_TEMP_END[$i,$j] ${aBENCH_CPU_TEMP_END[$i,$j]}" + if (( ${aBENCH_CPU_TEMP_END[$i,$j]} < ${aBENCH_RESULT_CPU_TEMP_END_MIN[$i]} )); then - aBENCH_RESULT_ROOTFS_READ_MIN[$i]=${aBENCH_ROOTFS_READ[$i,$j]} + aBENCH_RESULT_CPU_TEMP_END_MIN[$i]=${aBENCH_CPU_TEMP_END[$i,$j]} fi - if (( ${aBENCH_ROOTFS_READ[$i,$j]} > ${aBENCH_RESULT_ROOTFS_READ_MAX[$i]} )); then + if (( ${aBENCH_CPU_TEMP_END[$i,$j]} > ${aBENCH_RESULT_CPU_TEMP_END_MAX[$i]} )); then - aBENCH_RESULT_ROOTFS_READ_MAX[$i]=${aBENCH_ROOTFS_READ[$i,$j]} + aBENCH_RESULT_CPU_TEMP_END_MAX[$i]=${aBENCH_CPU_TEMP_END[$i,$j]} fi - (( aBENCH_RESULT_ROOTFS_READ_AVG[$i] += ${aBENCH_ROOTFS_READ[$i,$j]} )) + (( aBENCH_RESULT_CPU_TEMP_END_AVG[$i] += ${aBENCH_CPU_TEMP_END[$i,$j]} )) - #RAM - # echo "aBENCH_RAM_WRITE[$i,$j] ${aBENCH_RAM_WRITE[$i,$j]}" - if (( ${aBENCH_RAM_WRITE[$i,$j]} < ${aBENCH_RESULT_RAM_WRITE_MIN[$i]} )); then + #Last item in current array. Work out averages + if (( $j == ${aBENCH_CPU_INDEX[$i]} - 1 )); then - aBENCH_RESULT_RAM_WRITE_MIN[$i]=${aBENCH_RAM_WRITE[$i,$j]} + aBENCH_RESULT_CPU_AVG[$i]=$(bc -l <<< "scale=$BENCH_RESULTS_CPU_SCALE; ${aBENCH_RESULT_CPU_AVG[$i]} / ${aBENCH_CPU_INDEX[$i]}") + aBENCH_RESULT_CPU_TEMP_START_AVG[$i]=$(( ${aBENCH_RESULT_CPU_TEMP_START_AVG[$i]} / ${aBENCH_CPU_INDEX[$i]} )) + aBENCH_RESULT_CPU_TEMP_END_AVG[$i]=$(( ${aBENCH_RESULT_CPU_TEMP_END_AVG[$i]} / ${aBENCH_CPU_INDEX[$i]} )) - fi - if (( ${aBENCH_RAM_WRITE[$i,$j]} > ${aBENCH_RESULT_RAM_WRITE_MAX[$i]} )); then + if [[ $G_DEBUG == 1 ]]; then - aBENCH_RESULT_RAM_WRITE_MAX[$i]=${aBENCH_RAM_WRITE[$i,$j]} + echo "aBENCH_RESULT_CPU_AVG $i = ${aBENCH_RESULT_CPU_AVG[$i]}" + echo "aBENCH_RESULT_CPU_TEMP_START_AVG $i = ${aBENCH_RESULT_CPU_TEMP_START_AVG[$i]}" + echo "aBENCH_RESULT_CPU_TEMP_END_AVG $i = ${aBENCH_RESULT_CPU_TEMP_END_AVG[$i]}" + + fi fi - (( aBENCH_RESULT_RAM_WRITE_AVG[$i] += ${aBENCH_RAM_WRITE[$i,$j]} )) - # echo "aBENCH_RAM_READ[$i,$j] ${aBENCH_RAM_READ[$i,$j]}" - if (( ${aBENCH_RAM_READ[$i,$j]} < ${aBENCH_RESULT_RAM_READ_MIN[$i]} )); then + done - aBENCH_RESULT_RAM_READ_MIN[$i]=${aBENCH_RAM_READ[$i,$j]} + done + + # - RootFS + for i in ${!aBENCH_ROOTFS_INDEX[@]} + do + + aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]=$default_min_value + aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]=0 + aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]=0 + aBENCH_RESULT_ROOTFS_READ_MIN[$i]=$default_min_value + aBENCH_RESULT_ROOTFS_READ_MAX[$i]=0 + aBENCH_RESULT_ROOTFS_READ_AVG[$i]=0 + + for (( j=0; j<${aBENCH_ROOTFS_INDEX[$i]}; j++ )) + do + + if (( ${aBENCH_ROOTFS_WRITE[$i,$j]} < ${aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]} )); then + + aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]=${aBENCH_ROOTFS_WRITE[$i,$j]} fi - if (( ${aBENCH_RAM_READ[$i,$j]} > ${aBENCH_RESULT_RAM_READ_MAX[$i]} )); then + if (( ${aBENCH_ROOTFS_WRITE[$i,$j]} > ${aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]} )); then - aBENCH_RESULT_RAM_READ_MAX[$i]=${aBENCH_RAM_READ[$i,$j]} + aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]=${aBENCH_ROOTFS_WRITE[$i,$j]} fi - (( aBENCH_RESULT_RAM_READ_AVG[$i] += ${aBENCH_RAM_READ[$i,$j]} )) + (( aBENCH_RESULT_ROOTFS_WRITE_AVG[$i] += ${aBENCH_ROOTFS_WRITE[$i,$j]} )) - #CPU temp - # echo "aBENCH_CPU_TEMP_START[$i,$j] ${aBENCH_CPU_TEMP_START[$i,$j]}" - if (( $hw_model_supports_cpu_temps )); then + # echo "aBENCH_ROOTFS_READ[$i,$j] ${aBENCH_ROOTFS_READ[$i,$j]}" + if (( ${aBENCH_ROOTFS_READ[$i,$j]} < ${aBENCH_RESULT_ROOTFS_READ_MIN[$i]} )); then - if [[ ${aBENCH_CPU_TEMP_START[$i,$j]} =~ ^-?[0-9]+$ ]]; then + aBENCH_RESULT_ROOTFS_READ_MIN[$i]=${aBENCH_ROOTFS_READ[$i,$j]} - if (( ${aBENCH_CPU_TEMP_START[$i,$j]} < ${aBENCH_RESULT_CPU_TEMP_START_MIN[$i]} )); then + fi + if (( ${aBENCH_ROOTFS_READ[$i,$j]} > ${aBENCH_RESULT_ROOTFS_READ_MAX[$i]} )); then - aBENCH_RESULT_CPU_TEMP_START_MIN[$i]=${aBENCH_CPU_TEMP_START[$i,$j]} + aBENCH_RESULT_ROOTFS_READ_MAX[$i]=${aBENCH_ROOTFS_READ[$i,$j]} - fi - if (( ${aBENCH_CPU_TEMP_START[$i,$j]} > ${aBENCH_RESULT_CPU_TEMP_START_MAX[$i]} )); then + fi + (( aBENCH_RESULT_ROOTFS_READ_AVG[$i] += ${aBENCH_ROOTFS_READ[$i,$j]} )) - aBENCH_RESULT_CPU_TEMP_START_MAX[$i]=${aBENCH_CPU_TEMP_START[$i,$j]} + #Last item in current array. Work out averages + if (( $j == ${aBENCH_ROOTFS_INDEX[$i]} - 1 )); then - fi - (( aBENCH_RESULT_CPU_TEMP_START_AVG[$i] += ${aBENCH_CPU_TEMP_START[$i,$j]} )) + aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]=$(( ${aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]} / ${aBENCH_ROOTFS_INDEX[$i]} )) + aBENCH_RESULT_ROOTFS_READ_AVG[$i]=$(( ${aBENCH_RESULT_ROOTFS_READ_AVG[$i]} / ${aBENCH_ROOTFS_INDEX[$i]} )) - # echo "aBENCH_CPU_TEMP_END[$i,$j] ${aBENCH_CPU_TEMP_END[$i,$j]}" - if (( ${aBENCH_CPU_TEMP_END[$i,$j]} < ${aBENCH_RESULT_CPU_TEMP_END_MIN[$i]} )); then + if [[ $G_DEBUG == 1 ]]; then - aBENCH_RESULT_CPU_TEMP_END_MIN[$i]=${aBENCH_CPU_TEMP_END[$i,$j]} + echo "aBENCH_RESULT_ROOTFS_WRITE_AVG $i = ${aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]}" + echo "aBENCH_RESULT_ROOTFS_READ_AVG $i = ${aBENCH_RESULT_ROOTFS_READ_AVG[$i]}" - fi - if (( ${aBENCH_CPU_TEMP_END[$i,$j]} > ${aBENCH_RESULT_CPU_TEMP_END_MAX[$i]} )); then + fi - aBENCH_RESULT_CPU_TEMP_END_MAX[$i]=${aBENCH_CPU_TEMP_END[$i,$j]} + fi - fi - (( aBENCH_RESULT_CPU_TEMP_END_AVG[$i] += ${aBENCH_CPU_TEMP_END[$i,$j]} )) + done - else + done - hw_model_supports_cpu_temps=0 #Set unavailable for current HW model, do not check again for HW model - aBENCH_RESULT_CPU_TEMP_START_AVG[$i]='N/A' - aBENCH_RESULT_CPU_TEMP_END_AVG[$i]='N/A' + # - RAM + for i in ${!aBENCH_RAM_INDEX[@]} + do - aBENCH_RESULT_CPU_TEMP_START_MIN[$i]='N/A' - aBENCH_RESULT_CPU_TEMP_START_MAX[$i]='N/A' + aBENCH_RESULT_RAM_WRITE_MIN[$i]=$default_min_value + aBENCH_RESULT_RAM_WRITE_MAX[$i]=0 + aBENCH_RESULT_RAM_WRITE_AVG[$i]=0 - aBENCH_RESULT_CPU_TEMP_END_MIN[$i]='N/A' - aBENCH_RESULT_CPU_TEMP_END_MAX[$i]='N/A' + aBENCH_RESULT_RAM_READ_MIN[$i]=$default_min_value + aBENCH_RESULT_RAM_READ_MAX[$i]=0 + aBENCH_RESULT_RAM_READ_AVG[$i]=0 - fi + for (( j=0; j<${aBENCH_RAM_INDEX[$i]}; j++ )) + do - fi + if (( ${aBENCH_RAM_WRITE[$i,$j]} < ${aBENCH_RESULT_RAM_WRITE_MIN[$i]} )); then + + aBENCH_RESULT_RAM_WRITE_MIN[$i]=${aBENCH_RAM_WRITE[$i,$j]} - if [[ $G_DEBUG == 1 ]]; then + fi + if (( ${aBENCH_RAM_WRITE[$i,$j]} > ${aBENCH_RESULT_RAM_WRITE_MAX[$i]} )); then - echo "DEBUG Bench Entry: $i $j" - echo ${aBENCH_ROOTFS_WRITE[$i,$j]} - echo ${aBENCH_ROOTFS_READ[$i,$j]} - echo ${aBENCH_RAM_WRITE[$i,$j]} - echo ${aBENCH_RAM_READ[$i,$j]} - echo ${aBENCH_CPU_TEMP_START[$i,$j]} - echo ${aBENCH_CPU_TEMP_END[$i,$j]} + aBENCH_RESULT_RAM_WRITE_MAX[$i]=${aBENCH_RAM_WRITE[$i,$j]} fi + (( aBENCH_RESULT_RAM_WRITE_AVG[$i] += ${aBENCH_RAM_WRITE[$i,$j]} )) - #Last item in current array. Work out averages - if (( $j == ${aBENCH_COMMON_INDEX[$i]} - 1 )); then + # echo "aBENCH_RAM_READ[$i,$j] ${aBENCH_RAM_READ[$i,$j]}" + if (( ${aBENCH_RAM_READ[$i,$j]} < ${aBENCH_RESULT_RAM_READ_MIN[$i]} )); then + + aBENCH_RESULT_RAM_READ_MIN[$i]=${aBENCH_RAM_READ[$i,$j]} + + fi + if (( ${aBENCH_RAM_READ[$i,$j]} > ${aBENCH_RESULT_RAM_READ_MAX[$i]} )); then - aBENCH_RESULT_CPU_AVG[$i]=$(bc -l <<< "scale=$BENCH_RESULTS_CPU_SCALE; ${aBENCH_RESULT_CPU_AVG[$i]} / ${aBENCH_COMMON_INDEX[$i]}") - aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]=$(( ${aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]} / ${aBENCH_COMMON_INDEX[$i]} )) - aBENCH_RESULT_ROOTFS_READ_AVG[$i]=$(( ${aBENCH_RESULT_ROOTFS_READ_AVG[$i]} / ${aBENCH_COMMON_INDEX[$i]} )) - aBENCH_RESULT_RAM_WRITE_AVG[$i]=$(( ${aBENCH_RESULT_RAM_WRITE_AVG[$i]} / ${aBENCH_COMMON_INDEX[$i]} )) - aBENCH_RESULT_RAM_READ_AVG[$i]=$(( ${aBENCH_RESULT_RAM_READ_AVG[$i]} / ${aBENCH_COMMON_INDEX[$i]} )) + aBENCH_RESULT_RAM_READ_MAX[$i]=${aBENCH_RAM_READ[$i,$j]} - if (( $hw_model_supports_cpu_temps )); then + fi + (( aBENCH_RESULT_RAM_READ_AVG[$i] += ${aBENCH_RAM_READ[$i,$j]} )) - aBENCH_RESULT_CPU_TEMP_START_AVG[$i]=$(( ${aBENCH_RESULT_CPU_TEMP_START_AVG[$i]} / ${aBENCH_COMMON_INDEX[$i]} )) - aBENCH_RESULT_CPU_TEMP_END_AVG[$i]=$(( ${aBENCH_RESULT_CPU_TEMP_END_AVG[$i]} / ${aBENCH_COMMON_INDEX[$i]} )) + #Last item in current array. Work out averages + if (( $j == ${aBENCH_RAM_INDEX[$i]} - 1 )); then - fi + aBENCH_RESULT_RAM_WRITE_AVG[$i]=$(( ${aBENCH_RESULT_RAM_WRITE_AVG[$i]} / ${aBENCH_RAM_INDEX[$i]} )) + aBENCH_RESULT_RAM_READ_AVG[$i]=$(( ${aBENCH_RESULT_RAM_READ_AVG[$i]} / ${aBENCH_RAM_INDEX[$i]} )) if [[ $G_DEBUG == 1 ]]; then - echo "DEBUG Bench avg: $i" - echo "aBENCH_RESULT_CPU_AVG $i = ${aBENCH_RESULT_CPU_AVG[$i]}" - echo "aBENCH_RESULT_ROOTFS_WRITE_AVG $i = ${aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]}" - echo "aBENCH_RESULT_ROOTFS_READ_AVG $i = ${aBENCH_RESULT_ROOTFS_READ_AVG[$i]}" echo "aBENCH_RESULT_RAM_WRITE_AVG $i = ${aBENCH_RESULT_RAM_WRITE_AVG[$i]}" echo "aBENCH_RESULT_RAM_READ_AVG $i = ${aBENCH_RESULT_RAM_READ_AVG[$i]}" - echo "aBENCH_RESULT_CPU_TEMP_START_AVG $i = ${aBENCH_RESULT_CPU_TEMP_START_AVG[$i]}" - echo "aBENCH_RESULT_CPU_TEMP_END_AVG $i = ${aBENCH_RESULT_CPU_TEMP_END_AVG[$i]}" fi @@ -685,7 +714,7 @@ done - # - Optional benchmarks LAN + # - LAN for i in ${!aBENCH_LAN_INDEX[@]} do @@ -721,14 +750,63 @@ done - # - Optional benchmarks CUSTOMFS - #aBENCH_RESULT_CUSTOMFS_WRITE_MIN[$i]=$default_min_value - #aBENCH_RESULT_CUSTOMFS_WRITE_MAX[$i]=0 - #aBENCH_RESULT_CUSTOMFS_WRITE_AVG[$i]=0 + # - CustomFS + for i in ${!aBENCH_CUSTOMFS_INDEX[@]} + do + + aBENCH_RESULT_CUSTOMFS_WRITE_MIN[$i]=$default_min_value + aBENCH_RESULT_CUSTOMFS_WRITE_MAX[$i]=0 + aBENCH_RESULT_CUSTOMFS_WRITE_AVG[$i]=0 + aBENCH_RESULT_CUSTOMFS_READ_MIN[$i]=$default_min_value + aBENCH_RESULT_CUSTOMFS_READ_MAX[$i]=0 + aBENCH_RESULT_CUSTOMFS_READ_AVG[$i]=0 + + for (( j=0; j<${aBENCH_CUSTOMFS_INDEX[$i]}; j++ )) + do + + if (( ${aBENCH_CUSTOMFS_WRITE[$i,$j]} < ${aBENCH_RESULT_CUSTOMFS_WRITE_MIN[$i]} )); then + + aBENCH_RESULT_CUSTOMFS_WRITE_MIN[$i]=${aBENCH_CUSTOMFS_WRITE[$i,$j]} + + fi + if (( ${aBENCH_CUSTOMFS_WRITE[$i,$j]} > ${aBENCH_RESULT_CUSTOMFS_WRITE_MAX[$i]} )); then + + aBENCH_RESULT_CUSTOMFS_WRITE_MAX[$i]=${aBENCH_CUSTOMFS_WRITE[$i,$j]} - #aBENCH_RESULT_CUSTOMFS_READ_MIN[$i]=$default_min_value - #aBENCH_RESULT_CUSTOMFS_READ_MAX[$i]=0 - #aBENCH_RESULT_CUSTOMFS_READ_AVG[$i]=0 + fi + (( aBENCH_RESULT_CUSTOMFS_WRITE_AVG[$i] += ${aBENCH_CUSTOMFS_WRITE[$i,$j]} )) + + # echo "aBENCH_CUSTOMFS_READ[$i,$j] ${aBENCH_CUSTOMFS_READ[$i,$j]}" + if (( ${aBENCH_CUSTOMFS_READ[$i,$j]} < ${aBENCH_RESULT_CUSTOMFS_READ_MIN[$i]} )); then + + aBENCH_RESULT_CUSTOMFS_READ_MIN[$i]=${aBENCH_CUSTOMFS_READ[$i,$j]} + + fi + if (( ${aBENCH_CUSTOMFS_READ[$i,$j]} > ${aBENCH_RESULT_CUSTOMFS_READ_MAX[$i]} )); then + + aBENCH_RESULT_CUSTOMFS_READ_MAX[$i]=${aBENCH_CUSTOMFS_READ[$i,$j]} + + fi + (( aBENCH_RESULT_CUSTOMFS_READ_AVG[$i] += ${aBENCH_CUSTOMFS_READ[$i,$j]} )) + + #Last item in current array. Work out averages + if (( $j == ${aBENCH_CUSTOMFS_INDEX[$i]} - 1 )); then + + aBENCH_RESULT_CUSTOMFS_WRITE_AVG[$i]=$(( ${aBENCH_RESULT_CUSTOMFS_WRITE_AVG[$i]} / ${aBENCH_CUSTOMFS_INDEX[$i]} )) + aBENCH_RESULT_CUSTOMFS_READ_AVG[$i]=$(( ${aBENCH_RESULT_CUSTOMFS_READ_AVG[$i]} / ${aBENCH_CUSTOMFS_INDEX[$i]} )) + + if [[ $G_DEBUG == 1 ]]; then + + echo "aBENCH_RESULT_CUSTOMFS_WRITE_AVG $i = ${aBENCH_RESULT_CUSTOMFS_WRITE_AVG[$i]}" + echo "aBENCH_RESULT_CUSTOMFS_READ_AVG $i = ${aBENCH_RESULT_CUSTOMFS_READ_AVG[$i]}" + + fi + + fi + + done + + done # Create HTML file cat << _EOF_ > index.html @@ -752,7 +830,7 @@

DietPi-Survey report page

- Uploads since: 01.01.2019 00:00:00 UTC
+ Uploads since: 2019-01-01 00:00:00 UTC
Last update: $(TZ=UTC date "+%Y-%m-%d %T UTC")

@@ -761,52 +839,52 @@
Opted out installs$SURVEY_COUNT_EMPTY
-

DietPi versions:

+

DietPi versions:

$(for i in "${!aDIETPI_VERSION[@]}"; do echo ""; done | sort -nrk 1.17,1.20 -t ' ')
DietPi v$i ${aDIETPI_VERSION[$i]}
-

Git branches:

+

Git branches:

$(for i in "${!aGIT_BRANCH[@]}"; do echo ""; done | sort -nrk 2 -t ' ')
$i ${aGIT_BRANCH[$i]}
-

Devices:

+

Devices:

$(for i in "${!aDEVICE_NAME[@]}"; do echo ""; done | sort -nrk 2 -t ' ')
$i ${aDEVICE_NAME[$i]}
-

CPU architectures:

+

CPU architectures:

$(for i in "${!aCPU_ARCH[@]}"; do echo ""; done | sort -nrk 2 -t ' ')
$i ${aCPU_ARCH[$i]}
-

CPU core counts:

+

CPU core counts:

$(for i in ${!aCPU_COUNT[@]}; do echo ""; done | sort -nrk 2 -t ' ')
$i Core(s) ${aCPU_COUNT[$i]}
-

Distro versions:

+

Distro versions:

$(for i in "${!aDISTRO_VERSION[@]}"; do echo ""; done | sort -nrk 2 -t ' ')
$i ${aDISTRO_VERSION[$i]}
-

Autostart options:

+

Autostart options:

$(for i in "${!aAUTOSTART_OPTION[@]}"; do echo ""; done | sort -nrk 2 -t ' ')
$i ${aAUTOSTART_OPTION[$i]}
-

DietPi-Automation:

+

DietPi-Automation:

Used by${aAUTO_SETUP_AUTOMATED[1]} of $((${aAUTO_SETUP_AUTOMATED[1]} + ${aAUTO_SETUP_AUTOMATED[0]})) installs
-

Network interfaces:

+

Network interfaces:

$(for i in "${!aNETWORK_INTERFACE[@]}"; do echo ""; done | sort -nrk 2 -t ' ')
$i ${aNETWORK_INTERFACE[$i]}
-

Installed software titles:

+

Installed software titles:

$(for i in "${!aSOFTWARE[@]}"; do echo ""; done | sort -nrk 2 -t ' ')
$i ${aSOFTWARE[$i]}
@@ -821,49 +899,81 @@ Device: - Total benchmarks: - Average: - Fastest: - Slowest: - Average: - Lowest: - Highest: - Average: - Lowest: - Highest: + Count: + Average: + Fastest: + Slowest: + Average: + Lowest: + Highest: + Average: + Lowest: + Highest: - $(for i in "${!aBENCH_COMMON_INDEX[@]}"; do echo "${aHW_NAME[$i]:=$i} ${aBENCH_COMMON_INDEX[$i]} ${aBENCH_RESULT_CPU_AVG[$i]} ${aBENCH_RESULT_CPU_MIN[$i]} ${aBENCH_RESULT_CPU_MAX[$i]} ${aBENCH_RESULT_CPU_TEMP_START_AVG[$i]} ${aBENCH_RESULT_CPU_TEMP_START_MIN[$i]} ${aBENCH_RESULT_CPU_TEMP_START_MAX[$i]} ${aBENCH_RESULT_CPU_TEMP_END_AVG[$i]} ${aBENCH_RESULT_CPU_TEMP_END_MIN[$i]} ${aBENCH_RESULT_CPU_TEMP_END_MAX[$i]} "; done | sort -nk 1 -t ' ') + $(for i in "${!aBENCH_CPU_INDEX[@]}"; do echo "${aHW_NAME[$i]:=$i} ${aBENCH_CPU_INDEX[$i]} ${aBENCH_RESULT_CPU_AVG[$i]} ${aBENCH_RESULT_CPU_MIN[$i]} ${aBENCH_RESULT_CPU_MAX[$i]} ${aBENCH_RESULT_CPU_TEMP_START_AVG[$i]} ${aBENCH_RESULT_CPU_TEMP_START_MIN[$i]} ${aBENCH_RESULT_CPU_TEMP_START_MAX[$i]}${aBENCH_RESULT_CPU_TEMP_END_AVG[$i]} ${aBENCH_RESULT_CPU_TEMP_END_MIN[$i]} ${aBENCH_RESULT_CPU_TEMP_END_MAX[$i]} "; done | sort -nk 1 -t ' ') -

DietPi-Benchmarks | IO (Filesystem & RAM):

+

DietPi-Benchmarks | IO (RAM):

- - - - - - - - - - - - - - + + + + + + + - $(for i in "${!aBENCH_COMMON_INDEX[@]}"; do echo ""; done | sort -nk 1 -t ' ') + $(for i in "${!aBENCH_RAM_INDEX[@]}"; do echo ""; done )
- RootFS write (MB/s):RootFS read (MB/s): RAM write (MB/s): RAM read (MB/s):
Device:Total benchmarks:Average:Fastest:Slowest:Average:Fastest:Slowest:Average:Fastest:Slowest:Average:Fastest:Slowest:Count:Average:Fastest:Slowest:Average:Fastest:Slowest:
${aHW_NAME[$i]:=$i} ${aBENCH_COMMON_INDEX[$i]} ${aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]} ${aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]} ${aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]} ${aBENCH_RESULT_ROOTFS_READ_AVG[$i]} ${aBENCH_RESULT_ROOTFS_READ_MAX[$i]} ${aBENCH_RESULT_ROOTFS_READ_MIN[$i]} ${aBENCH_RESULT_RAM_WRITE_AVG[$i]} ${aBENCH_RESULT_RAM_WRITE_MAX[$i]} ${aBENCH_RESULT_RAM_WRITE_MIN[$i]} ${aBENCH_RESULT_RAM_READ_AVG[$i]} ${aBENCH_RESULT_RAM_READ_MAX[$i]} ${aBENCH_RESULT_RAM_READ_MIN[$i]}
${aHW_NAME[$i]:=$i} ${aBENCH_RAM_INDEX[$i]} ${aBENCH_RESULT_RAM_WRITE_AVG[$i]} ${aBENCH_RESULT_RAM_WRITE_MAX[$i]} ${aBENCH_RESULT_RAM_WRITE_MIN[$i]} ${aBENCH_RESULT_RAM_READ_AVG[$i]} ${aBENCH_RESULT_RAM_READ_MAX[$i]}${aBENCH_RESULT_RAM_READ_MIN[$i]}
-

DietPi-Benchmarks | Network LAN throughput:

+

DietPi-Benchmarks | IO (RootFS):

+ + + + + + + + + + + + + + + + $(for i in "${!aBENCH_ROOTFS_INDEX[@]}"; do echo ""; done ) +
+ RootFS write (MB/s):RootFS read (MB/s):
Device:Count:Average:Fastest:Slowest:Average:Fastest:Slowest:
${aHW_NAME[$i]:=$i} ${aBENCH_ROOTFS_INDEX[$i]} ${aBENCH_RESULT_ROOTFS_WRITE_AVG[$i]} ${aBENCH_RESULT_ROOTFS_WRITE_MAX[$i]} ${aBENCH_RESULT_ROOTFS_WRITE_MIN[$i]} ${aBENCH_RESULT_ROOTFS_READ_AVG[$i]} ${aBENCH_RESULT_ROOTFS_READ_MAX[$i]}${aBENCH_RESULT_ROOTFS_READ_MIN[$i]}
+ +

DietPi-Benchmarks | IO (Custom FS):

+ + + + + + + + + + + + + + + + $(for i in "${!aBENCH_CUSTOMFS_INDEX[@]}"; do echo ""; done ) +
+ Custom FS write (MB/s):Custom FS read (MB/s):
Device:Count:Average:Fastest:Slowest:Average:Fastest:Slowest:
${aHW_NAME[$i]:=$i} ${aBENCH_CUSTOMFS_INDEX[$i]} ${aBENCH_RESULT_CUSTOMFS_WRITE_AVG[$i]} ${aBENCH_RESULT_CUSTOMFS_WRITE_MAX[$i]} ${aBENCH_RESULT_CUSTOMFS_WRITE_MIN[$i]} ${aBENCH_RESULT_CUSTOMFS_READ_AVG[$i]} ${aBENCH_RESULT_CUSTOMFS_READ_MAX[$i]}${aBENCH_RESULT_CUSTOMFS_READ_MIN[$i]}
+ +

DietPi-Benchmarks | IO (Network LAN):

- - - - + + + + - $(for i in "${!aBENCH_LAN_INDEX[@]}"; do echo ""; done | sort -nk 1 -t ' ') + $(for i in "${!aBENCH_LAN_INDEX[@]}"; do echo ""; done )
@@ -871,19 +981,27 @@
Device:Total benchmarks:Average:Fastest:Slowest:Count:Average:Fastest:Slowest:
${aHW_NAME[$i]:=$i} ${aBENCH_LAN_INDEX[$i]} ${aBENCH_RESULT_NET_LAN_SPEED_AVG[$i]} ${aBENCH_RESULT_NET_LAN_SPEED_MAX[$i]} ${aBENCH_RESULT_NET_LAN_SPEED_MIN[$i]}
${aHW_NAME[$i]:=$i} ${aBENCH_LAN_INDEX[$i]} ${aBENCH_RESULT_NET_LAN_SPEED_AVG[$i]} ${aBENCH_RESULT_NET_LAN_SPEED_MAX[$i]}${aBENCH_RESULT_NET_LAN_SPEED_MIN[$i]}
_EOF_ # Move HTML page in place - mv index.html /var/www/survey/index.html + if [[ $G_DEBUG == 1 ]]; then + + mv index.html /var/www/survey/debug.html + + else + + mv index.html /var/www/survey/index.html + + fi } diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 6cbaf6444b..369b61e44d 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,69 @@ +v6.23 +(XX/05/19) + +Jessie support: +- The support for Debian Jessie is fading constantly by software titles and Debian itself, increasing the effort for us to work around the raising issues: https://github.com/MichaIng/DietPi/issues/2332 +- As a result we move Jessie systems to a dedicated "jessie-support" branch. Next DietPi v6.24 will still be merged into this branch as well, but for following updates it depends on how much additional related issues we face. +- We highly recommend to migrate to Stretch as fast as possible. +- For Ordoid C1 there is no Stretch image available since its kernel and firmware are not maintained to match minimum requirements. There are reports about successful "apt-get dist-upgrade" migrations and an ARMbian Stretch image is available that can be used as a basis for DietPi-PREP. But these systems face major limitations, especially no GPU (Xserver, Kodi, desktops) support is available. Read more about it or contribute to solutions for Odroid C1 users here: https://github.com/MichaIng/DietPi/issues/2561 + +Changes / Improvements / Optimisations: +- DietPi-Banner | Added support for DietPi message of the day (MOTD). This is enabled by default, however, can be disabled. Checks for latest MOTD once a day. +- DietPi-Banner | Always prints the local IP during boot mode display: https://github.com/MichaIng/DietPi/issues/2681 +- DietPi-Benchmark | Increased default survey RootFS and RAM benchmark sizes. 100MB (from 10MB) for RootFS. RAM is 1/4 of available. This is ensure a more accurate calculation of throughput when we divide bytes against time, to obtain the MB/s result. +- DietPi-LetsEncrypt | When applying to Lighttpd, "webroot" authentication is now used instead of "standalone". This allows the auto-renewal service to succeed while Lighttpd is running. Many thanks to @minnux for testing this method: https://github.com/MichaIng/DietPi/issues/2680#issuecomment-480095449 +- DietPi-Arr_to_RAM | With v6.18 we silently added a new script (for Stretch and above) that allows linking Sonarr/Radarr/Lidarr database files to RAM, increasing access performance, reducing disk I/O and avoiding constant external HDD spinning due to the very regular access to these files. This script has gone through some rework and polishing and can now be enabled to automatically link those databases to RAM on boot and store them back to disk on shutdown. For more details read: https://dietpi.com/phpbb/viewtopic.php?f=8&t=5828. Many thanks to @Dr0bac for providing valuable input and testing the development progress constantly: https://github.com/MichaIng/DietPi/issues/2689 +- DietPi-Drive_Manager | encryptfs and vboxsf (VirtualBox shared folder) fstab entries are now preserved. Many thanks to @johnvick and @Phil1988 for suggesting: https://github.com/MichaIng/DietPi/issues/2078, https://github.com/MichaIng/DietPi/issues/2202 +- DietPi-Config | Added support to toggle Intel CPU turbo/boost mode. Requires Intel CPU that supports the feature. +- DietPi-Config | G_CHECK_URL: Added ability to change the connection attempts and timeout, before DietPi URL checking assumes a dead link and failure: https://github.com/MichaIng/DietPi/issues/2717 +- DietPi-Config | Serial/UART device handling has been reworked. Serial login consoles can now be toggled for every found serial device individually. On RPi the primary UART can be completely disabled and warnings are prompted if Bluetooth and login console are to be enabled both on ttyAMA0. On update existing systems will be patched so that serial-getty masks and enabled instances are removed if the related serial device does not exist. This solves some error messages during boot. +- DietPi-Config | Network Adapter menu has been cleaned up. Proxy variables are now sourced from "/etc/bashrc.d/dietpi-proxy.sh" and proxy setup outside of DietPi scripts is detected. +- DietPi-NordVPN | Added ability to toggle auto start/connect during boot. +- DietPi-Software | Subsonic: Package has been updated to v6.1.5. Many thanks to @spectrumcomputing: https://github.com/MichaIng/DietPi/pull/2702 +- DietPi-Software | PHP: All systems will be upgraded to PHP7.3 for security, performance, compatibility and consistency across distro versions. Ondrejs (official Debian PHP maintainer) PHP repository (sury.org) is used for this on Jessie and Stretch, so general functionality and trustworthiness is assured. ownCloud users will stay on PHP7.2 for now since ownCloud does not yet support PHP7.3. Your PHP configurations will be backed up and webserver configurations adjusted to match the new version. Nextcloud 13 and earlier, especially Jessie systems, will be upgraded to Nextcloud 14 to allow PHP7.3. A full Nextcloud backup will be done, your data, settings and custom apps will be preserved. We strongly advice to further upgrade to the current Nextcloud major version via its web UI updater. +- DietPi-Software | Subsonic: Runs now as limited user "subsonic". This change is as well applied to existing installs via patch during DietPi-Update: https://github.com/MichaIng/DietPi/pull/2705 +- DietPi-Software | WireGuard APT packages are now upgraded when running "apt-get upgrade". Many thanks to @swrobel for reporting this issue: https://github.com/MichaIng/DietPi/issues/2671 +- DietPi-Software | LXQt, GIMP, XFCE4 Power manager: Now available for installations. +- DietPi-Software | Plex Media Server: All systems are migrated to the new official APT repository. This allows easy and consistent upgrades via APT. On ARM systems the until now used 3rd party dev2day repo receives no further updates and will be shut down soon, which makes the migration mandatory. Many thanks to @WolfganP for keeping us informed with news about Plex v1.15 and the new APT repo: https://github.com/MichaIng/DietPi/issues/2655 +- DietPi-Software | Logitech Media Server: Now installs the latest nightly version, since no public "releases" are done. As well the systemd service has gone through some update and now runs as limited user to align with other media servers, enhance security and follow the defaults of the DPKG package. The update/change is applied to existing installs via DietPi-Update as well. Your settings/date are preserved. +- DietPi-Software | Tor/WiFi Hotspot: Resolved an issue where WiFi Hotspot fails to start when Tor Hotspot is installed. Many thanks to @schnuckz for reporting this issue: https://github.com/MichaIng/DietPi/issues/2673#issuecomment-482605700 +- DietPi-Software | Nextcloud Talk: We do not apply (D)TLS settings to coTURN any more. Since WebRTC is encrypted by itself there is no security benefit. More importantly Nextcloud Talk does not make use of the required TURNS protocol, so there is absolutely no point to apply these settings. The (D)TLS feature is meant to allow passing firewalls that only allow encrypted traffic. WebRTC, although encrypted, might not pass such firewalls since the encryption is not on transport layer. For those how are interested in further details and discussion: https://github.com/coturn/coturn/issues/33, https://github.com/nextcloud/spreed/issues/257 + +Bug Fixes: +- System | Debian has vastly reduced support for Jessie systems from their official APT repository. The limited possible list entries are applied during DietPi-Update. Many thanks to @BerndKohl for reporting this issue: https://github.com/MichaIng/DietPi/issues/2665 +- DietPi-Set_swapfile | Resolved an issue where on first boot (and when calling the script manually) the swapfile creation is attempted on target file systems that do not support it (BTRFS). Many thanks to @mzramna for reporting this issue: https://github.com/MichaIng/DietPi/issues/719#issuecomment-484205696 +- DietPi-Config | Resolved an issue where proxy settings would not be correct after a reboot. Many thanks to @stephantual for reporting this!: https://github.com/MichaIng/DietPi/issues/2704 +- DietPi-Update | Resolved an issue where on older images first run update didn't finalise as intended, leading to several first run setup issues, depending on the image age. The fix has been applied outside of the releases since only the online part of the updater is affected: https://github.com/MichaIng/DietPi/pull/2684 +- DietPi-Login | Resolved an issue where login as non-root user could result in a "sudo" password prompt or endless failure loop due to missing sudo permissions. Many thanks to @xsak for reporting this issue: https://github.com/MichaIng/DietPi/issues/2667 +- DietPi-Software | Emby Server: Resolved an issue where download failed if the latest release does not contain a Debian package. Many thanks to @niblettr for reporting this issue: https://dietpi.com/phpbb/viewtopic.php?f=11&t=5755 +- DietPi-Software | Transmission: Resolved an issue where double quotes in global software password caused a service startup failure. Many thanks to @Drew80 for reporting this issue: https://github.com/MichaIng/DietPi/issues/2484#issuecomment-480675168 +- DietPi-Software | WireGuard: Resolved an issue where IPv6 connections did not work with enabled IPv6 forwarding. Many thats to @schnuckz for reporting this issue: https://github.com/MichaIng/DietPi/issues/2691 +- DietPi-Software | Subsonic: Resolved an issue where FFmpeg transcoder might not have been applied correctly. Many thanks to @spectrumcomputing for reporting this issue: https://github.com/MichaIng/DietPi/issues/2697 +- DietPi-Software | AmiBerry: Resolved an issue where no login prompt was present when exiting AmiBerry from fastboot mode. Many thanks to @Trigger58 for reporting this issue: https://github.com/MichaIng/DietPi/issues/2703#issuecomment-482471440 +- DietPi-Software | Logitech Media Server: Resolved an issue where certain plugins failed due to missing "libio-socket-ssl-perl". Many thanks to @noobian and @Edward for reporting this issue: https://dietpi.com/phpbb/viewtopic.php?f=9&t=5824 +- DietPi-Software | Fail2Ban: Resolved an issue where the service silently failed due to wrong log level settings on Stretch and Buster systems. Many thanks to @joaofl for reporting this issue: https://github.com/MichaIng/DietPi/issues/90#issuecomment-485140236 +- DietPi-Software | Redis: Resolved an issue on Jessie systems where the service fails to start due to wrong shipped permissions from Debian package: https://github.com/MichaIng/DietPi/issues/2736 +- DietPi-Software | Nextcloud: Resolved an issue on Lighttpd with HTTPS enabled where OPcache settings were not applied as desired, leading to a warning on Nextcloud admin panel. Many thanks to @Borotes for reporting this issue: https://github.com/MichaIng/DietPi/issues/2489 +- DietPi-Software | Nextcloud Talk: Resolved an issue where coTURN prints two warnings about deprecated settings on Buster systems, due to some changes with latest versions. +- DietPi-Software | Kodi: Resolved an issue on RPi where Kodi (v18) fails to start when a custom screen resolution was chosen. Many thanks to @johnnypea for reporting this issue: https://dietpi.com/phpbb/viewtopic.php?p=17550#p17550 + +As always, many smaller code performance and stability improvements, visual and spelling fixes have been done, too much to list all of them here. Check out all code changes of this release on GitHub: https://github.com/MichaIng/DietPi/pull/XXXX/files + +Known/Outstanding Issues: +- DietPi-Config | Enabling WiFi + Ethernet adapters, both on different subnets, breaks WiFi connection in some cases: https://github.com/MichaIng/DietPi/issues/2103 +- DietPi-Config | RPi: Enabling OpenGL/VC4 causes sound card selection to be invalid: https://github.com/MichaIng/DietPi/issues/2173 +- RPi | LXAppearance (on LXDE desktop) hangs on dbus-launch: https://github.com/MichaIng/DietPi/issues/1791 +- Odroid C2 | Some WiFi adapters do no work as hotspot: https://github.com/MichaIng/DietPi/issues/1955 +- Odroid XU4 | Kodi freezes shortly on video playback: https://github.com/MichaIng/DietPi/issues/2584 +- Rock64 | 3.5mm A/V jack is currently not functional: https://github.com/MichaIng/DietPi/issues/2522 +- DietPi-Software | Node-RED: Pre-installed modules cannot be updated via web UI: https://github.com/MichaIng/DietPi/issues/2073 +- DietPi-Software | Raspimjpeg: With Lighttpd, streaming mjpeg does not work: https://github.com/MichaIng/DietPi/issues/1747 + +For all additional issues that may appear after release, please see the following link for active tickets: https://github.com/MichaIng/DietPi/issues + +----------------------------------------------------------------------------------------------------------- + v6.22 (23/03/19) @@ -51,19 +116,6 @@ Bug Fixes: As always, many smaller code performance and stability improvements, visual and spelling fixes have been done, too much to list all of them here. Check out all code changes of this release on GitHub: https://github.com/MichaIng/DietPi/pull/2653/files -Known/Outstanding Issues: -- DietPi-Config | Enabling WiFi + Ethernet adapters, both on different subnets, breaks WiFi connection in some cases: https://github.com/MichaIng/DietPi/issues/2103 -- DietPi-Config | RPi: Enabling OpenGL/VC4 causes sound card selection to be invalid: https://github.com/MichaIng/DietPi/issues/2173 -- DietPi-Drive_Manager | encryptfs is currently not supported and will be removed from fstab when executing drive manager: https://github.com/MichaIng/DietPi/issues/2078 -- RPi | LXAppearance (on LXDE desktop) hangs on dbus-launch: https://github.com/MichaIng/DietPi/issues/1791 -- Odroid C2 | Some WiFi adapters do no work as hotspot: https://github.com/MichaIng/DietPi/issues/1955 -- Odroid XU4 | Kodi freezes shortly on video playback: https://github.com/MichaIng/DietPi/issues/2584 -- Rock64 | 3.5mm A/V jack is currently not functional: https://github.com/MichaIng/DietPi/issues/2522 -- DietPi-Software | Node-RED: Pre-installed modules cannot be updated via web UI: https://github.com/MichaIng/DietPi/issues/2073 -- DietPi-Software | Raspimjpeg: With Lighttpd, streaming mjpeg does not work: https://github.com/MichaIng/DietPi/issues/1747 - -For all additional issues that may appear after release, please see the following link for active tickets: https://github.com/MichaIng/DietPi/issues - ----------------------------------------------------------------------------------------------------------- v6.21 (Hotfix) diff --git a/PREP_SYSTEM_FOR_DIETPI.sh b/PREP_SYSTEM_FOR_DIETPI.sh index 15e1c15444..18b8ed64f4 100644 --- a/PREP_SYSTEM_FOR_DIETPI.sh +++ b/PREP_SYSTEM_FOR_DIETPI.sh @@ -16,7 +16,7 @@ # - G_DISTRO_NAME #------------------------------------------------------------------------------------------------ - #Core globals + # Core globals G_PROGRAM_NAME='DietPi-PREP' G_GITOWNER=${GITOWNER:-MichaIng} unset GITOWNER @@ -32,31 +32,19 @@ fi - #Work inside /tmp as usually ramfs to reduce disk I/O and speed up download and unpacking + # Work inside /tmp as usually ramfs to reduce disk I/O and speed up download and unpacking # - Save full script path, beforehand: https://github.com/MichaIng/DietPi/pull/2341#discussion_r241784962 FP_PREP_SCRIPT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")" cd /tmp - #Prefer IPv4 by default, to avoid hanging access attempts in some cases + # APT: Prefer IPv4 by default to avoid hanging access attempts in some cases # - NB: This needs to match the method in: /DietPi/dietpi/func/dietpi-set_hardware preferipv4 enable - # - APT echo 'Acquire::ForceIPv4 "true";' > /etc/apt/apt.conf.d/99-dietpi-force-ipv4 - # - Wget - if grep -q '^[[:blank:]]*prefer-family[[:blank:]]*=' /etc/wgetrc; then - - sed -i '/^[[:blank:]]*prefer-family[[:blank:]]*=/c\prefer-family = IPv4' /etc/wgetrc - - elif grep -q '^[[:blank:]#;]*prefer-family[[:blank:]]*=' /etc/wgetrc; then - - sed -i '/^[[:blank:]#;]*prefer-family[[:blank:]]*=/c\prefer-family = IPv4' /etc/wgetrc - - else - - echo 'prefer-family = IPv4' >> /etc/wgetrc - fi + # Allow PDiffs on RPi since the "slow implementation" argument is outdated and PDiffs allow lower download size and less disk I/O + [[ -f '/etc/apt/apt.conf.d/50raspi' ]] && rm /etc/apt/apt.conf.d/50raspi - #Check/install minimal APT Pre-Reqs + # Check/install minimal APT Pre-Reqs a_MIN_APT_PREREQS=( 'apt-transport-https' # Allows HTTPS sources for APT @@ -69,11 +57,26 @@ ) - #Removing conflicting /etc/apt/sources.list.d entries + # Removing conflicting /etc/apt/sources.list.d entries # - Meveric: https://github.com/MichaIng/DietPi/issues/1285#issuecomment-355759321 - [[ -f /etc/apt/sources.list.d/deb-multimedia.list ]] && rm /etc/apt/sources.list.d/deb-multimedia.list + [[ -f '/etc/apt/sources.list.d/deb-multimedia.list' ]] && rm /etc/apt/sources.list.d/deb-multimedia.list # - OMV: https://dietpi.com/phpbb/viewtopic.php?f=11&t=2772&p=10646#p10594 - [[ -f /etc/apt/sources.list.d/openmediavault.list ]] && rm /etc/apt/sources.list.d/openmediavault.list + [[ -f '/etc/apt/sources.list.d/openmediavault.list' ]] && rm /etc/apt/sources.list.d/openmediavault.list + + # Fixing sources.list due to Debian dropped Jessie support: https://github.com/MichaIng/DietPi/issues/2665 + if grep -qi 'jessie' /etc/os-release && ! grep -qi 'raspbian' /etc/os-release; then + + if [[ $(uname -m) == 'aarch64' ]]; then + + echo 'deb http://archive.debian.org/debian/ main contrib non-free' > /etc/apt/sources.list + + else + + sed -Ei '/jessie-(backports|updates)/d' /etc/apt/sources.list + + fi + + fi apt-get clean apt-get update @@ -88,10 +91,25 @@ fi done - unset a_MIN_APT_PREREQS - #Setup locale + # Wget: Prefer IPv4 by default to avoid hanging access attempts in some cases + # - NB: This needs to match the method in: /DietPi/dietpi/func/dietpi-set_hardware preferipv4 enable + if grep -q '^[[:blank:]]*prefer-family[[:blank:]]*=' /etc/wgetrc; then + + sed -i '/^[[:blank:]]*prefer-family[[:blank:]]*=/c\prefer-family = IPv4' /etc/wgetrc + + elif grep -q '^[[:blank:]#;]*prefer-family[[:blank:]]*=' /etc/wgetrc; then + + sed -i '/^[[:blank:]#;]*prefer-family[[:blank:]]*=/c\prefer-family = IPv4' /etc/wgetrc + + else + + echo 'prefer-family = IPv4' >> /etc/wgetrc + + fi + + # Setup locale # - Remove existing settings that could break dpkg-reconfigure locales > /etc/environment [[ -f /etc/default/locale ]] && rm /etc/default/locale @@ -118,7 +136,7 @@ export LANG=en_GB.UTF8 export LC_ALL=en_GB.UTF8 - #Select gitbranch + # Select gitbranch aWHIP_BRANCH=( 'master' ': Stable release (recommended)' @@ -215,17 +233,17 @@ fi - #WiFi install flag + # WiFi install flag WIFI_REQUIRED=0 - #Image creator flags + # Image creator flags IMAGE_CREATOR='' PREIMAGE_INFO='' - #Setup step, current (used in info) + # Setup step, current (used in info) SETUP_STEP=0 - #URL connection test var holder + # URL connection test var holder INTERNET_ADDRESS='' Main(){ @@ -241,24 +259,27 @@ G_DIETPI-NOTIFY 2 'DietPi system found, running pre-prep' - # - Stop services + # - Stop services: RAMdisk includes (Pre|Post)Boot due to dependencies [[ -f /DietPi/dietpi/dietpi-services ]] && /DietPi/dietpi/dietpi-services stop - [[ -f /etc/systemd/system/dietpi-ramdisk.service ]] && systemctl stop dietpi-ramdisk [[ -f /etc/systemd/system/dietpi-ramlog.service ]] && systemctl stop dietpi-ramlog + [[ -f /etc/systemd/system/dietpi-ramdisk.service ]] && systemctl stop dietpi-ramdisk + + # - Disable services + for i in /etc/systemd/system/dietpi-* + do + + [[ -f $i ]] || continue + systemctl disable ${i##*/} + rm $i + + done # - Delete any previous existing data # Failsafe umount /DietPi [[ -d /DietPi ]] && rm -R /DietPi - [[ -d /boot/dietpi ]] && rm -R /boot/dietpi - - [[ -d /mnt/dietpi-backup ]] && rm -R /mnt/dietpi-backup - [[ -d /mnt/dietpi-sync ]] && rm -R /mnt/dietpi-sync - [[ -d /mnt/dietpi_userdata ]] && rm -R /mnt/dietpi_userdata - - [[ -d /etc/dietpi ]] && rm -R /etc/dietpi # Pre v160 - [[ -d /var/lib/dietpi ]] && rm -R /var/lib/dietpi - [[ -d /var/tmp/dietpi ]] && rm -R /var/tmp/dietpi + rm -Rf /{boot,mnt,etc,var/lib,var/tmp}/dietpi* + rm -f /etc/{bashrc,profile,sysctl}.d/dietpi* [[ -f /root/DietPi-Automation.log ]] && rm /root/DietPi-Automation.log [[ -f /boot/Automation_Format_My_Usb_Drive ]] && rm /boot/Automation_Format_My_Usb_Drive @@ -277,7 +298,7 @@ G_DIETPI-NOTIFY 2 '-----------------------------------------------------------------------------------' #------------------------------------------------------------------------------------------------ - #Image creator + # Image creator while : do @@ -328,7 +349,7 @@ done - #Pre-image used/name + # Pre-image used/name while : do @@ -343,7 +364,7 @@ done - #Hardware selection + # Hardware selection # NB: PLEASE ENSURE HW_MODEL INDEX ENTRIES MATCH : PREP, dietpi-obtain_hw_model, dietpi-survey_results, # NBB: DO NOT REORDER INDEX's. These are now fixed and will never change (due to survey results etc) G_WHIP_DEFAULT_ITEM=22 @@ -382,6 +403,7 @@ '68' ': NanoPC T4' '67' ': NanoPi K1 Plus' '14' ': Odroid N1' + '15' ': Odroid N2' '13' ': Odroid U3' '38' ': OrangePi PC 2' '37' ': OrangePi Prime' @@ -436,7 +458,7 @@ fi - #Distro Selection + # Distro Selection DISTRO_LIST_ARRAY=( '4' ': Stretch (current stable release, recommended)' @@ -581,7 +603,7 @@ G_DISTRO=$DISTRO_TARGET G_DISTRO_NAME=$DISTRO_TARGET_NAME G_HW_MODEL=$G_HW_MODEL G_RUN_CMD /DietPi/dietpi/func/dietpi-set_software apt-mirror 'default' # - Meveric, update repo to use our EU mirror: https://github.com/MichaIng/DietPi/issues/1519#issuecomment-368234302 - sed -i 's@https://oph.mdrjr.net/meveric@http://fuzon.co.uk/meveric@' /etc/apt/sources.list.d/meveric* &> /dev/null + sed -Ei 's@https?://oph\.mdrjr\.net@http://fuzon.co.uk@' /etc/apt/sources.list.d/meveric* &> /dev/null # - (Re)create DietPi logs dir, used by G_AGx G_RUN_CMD mkdir -p /var/tmp/dietpi/logs @@ -635,6 +657,7 @@ _EOF_ 'curl' # Web address testing, downloading, uploading etc. 'debconf' # APT package pre-configuration, e.g. "debconf-set-selections" for non-interactive install 'dirmngr' # GNU key management required for some APT installs via additional repos + 'dropbear-run' # DietPi default SSH-Client, excluding initramfs integration 'ethtool' # Ethernet link checking 'fake-hwclock' # Hardware clock emulation, to allow correct timestamps during boot before network time sync 'gnupg' # apt-key add @@ -661,7 +684,7 @@ _EOF_ ) # - G_HW_MODEL specific required repo key packages: https://github.com/MichaIng/DietPi/issues/1285#issuecomment-358301273 - if (( $G_HW_MODEL >= 10 )); then + if (( $G_HW_MODEL > 9 )); then G_AGI debian-archive-keyring aPACKAGES_REQUIRED_INSTALL+=('initramfs-tools') # RAM file system initialization, required for generic boot loader, but not required/used by RPi bootloader @@ -683,17 +706,6 @@ _EOF_ fi - # - G_DISTRO specific required packages: - if (( $G_DISTRO < 4 )); then - - aPACKAGES_REQUIRED_INSTALL+=('dropbear') # DietPi default SSH-Client - - else - - aPACKAGES_REQUIRED_INSTALL+=('dropbear-run') # DietPi default SSH-Client (excluding initramfs integration, available since Stretch) - - fi - # - G_HW_MODEL specific required packages: if (( $G_HW_MODEL != 20 )); then @@ -770,11 +782,16 @@ _EOF_ # Buster systemd-udevd doesn't support the current raspi-copies-and-fills: https://github.com/MichaIng/DietPi/issues/1286 (( $DISTRO_TARGET < 5 )) && G_AGI raspi-copies-and-fills + # Odroid N2 + elif (( $G_HW_MODEL == 15 )); then + + G_AGI linux-image-arm64-odroid-n2 + # Odroid N1 elif (( $G_HW_MODEL == 14 )); then G_AGI linux-image-arm64-odroid-n1 - #G_AGI libdrm-rockchip1 #Not currently on meveric's repo + #G_AGI libdrm-rockchip1 # Not currently on meveric's repo # Odroid C2 elif (( $G_HW_MODEL == 12 )); then @@ -784,9 +801,7 @@ _EOF_ # Odroid XU3/4/HC1/HC2 elif (( $G_HW_MODEL == 11 )); then - #G_AGI linux-image-4.9-armhf-odroid-xu3 - G_AGI $(dpkg --get-selections | mawk '/^linux-image/ {print $1}') - dpkg --get-selections | grep -q '^linux-image' || G_AGI linux-image-4.14-armhf-odroid-xu4 + G_AGI linux-image-4.14-armhf-odroid-xu4 # Odroid C1 elif (( $G_HW_MODEL == 10 )); then @@ -796,12 +811,12 @@ _EOF_ # BBB elif (( $G_HW_MODEL == 71 )); then - G_AGI device-tree-compiler #Kern + G_AGI device-tree-compiler # dtoverlay compiler # - Auto detect kernel package incl. ARMbian/others DTB else - AUTO_DETECT_KERN_PKG=$(dpkg --get-selections | grep -E '^linux-(image|dtb)' | awk '{print $1}') + AUTO_DETECT_KERN_PKG=$(dpkg --get-selections | grep -E '^linux-(image|dtb)' | mawk '{print $1}') if [[ $AUTO_DETECT_KERN_PKG ]]; then G_AGI $AUTO_DETECT_KERN_PKG @@ -825,7 +840,7 @@ _EOF_ if (( $G_HW_MODEL != 20 )); then aPACKAGES_REQUIRED_INSTALL+=('firmware-realtek') # Eth/WiFi/BT dongle firmware - aPACKAGES_REQUIRED_INSTALL+=('firmware-linux-nonfree') + aPACKAGES_REQUIRED_INSTALL+=('firmware-linux-nonfree') # Various drivers for generic devices fi @@ -834,18 +849,7 @@ _EOF_ aPACKAGES_REQUIRED_INSTALL+=('firmware-atheros') # WiFi dongle firmware aPACKAGES_REQUIRED_INSTALL+=('firmware-brcm80211') # WiFi dongle firmware aPACKAGES_REQUIRED_INSTALL+=('firmware-iwlwifi') # Intel WiFi dongle/PCI-e firwmare - - # Intel/Nvidia/WiFi (ralink) dongle firmware: https://github.com/MichaIng/DietPi/issues/1675#issuecomment-377806609 - # On Jessie, firmware-misc-nonfree is not available, firmware-ralink instead as dedicated package. - if (( $G_DISTRO < 4 )); then - - aPACKAGES_REQUIRED_INSTALL+=('firmware-ralink') - - else - - aPACKAGES_REQUIRED_INSTALL+=('firmware-misc-nonfree') - - fi + aPACKAGES_REQUIRED_INSTALL+=('firmware-misc-nonfree') # Intel/Nvidia/WiFi (Ralink) dongle firmware fi @@ -999,11 +1003,11 @@ _EOF_ [[ -f /etc/cron.d/make_nas_processes_faster ]] && rm /etc/cron.d/make_nas_processes_faster #----------------------------------------------------------------------------------- - #Boot Logo + # Boot Logo [[ -f /boot/boot.bmp ]] && G_RUN_CMD wget https://github.com/$G_GITOWNER/DietPi/raw/$G_GITBRANCH/.meta/images/dietpi-logo_boot.bmp -O /boot/boot.bmp #----------------------------------------------------------------------------------- - #Bash Profiles + # Bash Profiles # - Pre v6.9 cleaning: sed -i '/\/DietPi/d' /root/.bashrc @@ -1031,7 +1035,7 @@ _EOF_ chmod 4755 $(which sudo) #----------------------------------------------------------------------------------- - #Dir's + # Dirs G_DIETPI-NOTIFY 2 'Configuring DietPi Directories' @@ -1068,7 +1072,7 @@ _EOF_ mkdir -p /mnt/nfs_client #----------------------------------------------------------------------------------- - #Services + # Services G_DIETPI-NOTIFY 2 'Configuring DietPi Services:' @@ -1079,7 +1083,7 @@ _EOF_ G_RUN_CMD systemctl enable dietpi-kill_ssh #----------------------------------------------------------------------------------- - #Cron Jobs + # Cron Jobs G_DIETPI-NOTIFY 2 'Configuring Cron:' @@ -1100,7 +1104,7 @@ _EOF_ G_ERROR_HANDLER #----------------------------------------------------------------------------------- - #Network + # Network G_DIETPI-NOTIFY 2 'Configuring wlan/eth naming to be preferred for networked devices:' ln -sfv /dev/null /etc/systemd/network/99-default.link @@ -1118,7 +1122,7 @@ _EOF_ systemctl disable wpa_supplicant 2> /dev/null && G_DIETPI-NOTIFY 2 'Disabled non-required wpa_supplicant systemd unit' #----------------------------------------------------------------------------------- - #MISC + # MISC G_DIETPI-NOTIFY 2 'Disabling apt-daily services to prevent random APT cache lock' @@ -1295,9 +1299,9 @@ _EOF_ #G_DIETPI-NOTIFY 2 "Configuring regional settings (Locale):" - #Runs at start of script + # Runs at start of script - #G_HW_ARCH specific + # G_HW_ARCH specific G_DIETPI-NOTIFY 2 'Applying G_HW_ARCH specific tweaks:' if (( $G_HW_ARCH == 10 )); then @@ -1319,7 +1323,7 @@ _EOF_ fi - #G_HW_MODEL specific + # G_HW_MODEL specific G_DIETPI-NOTIFY 2 'Appling G_HW_MODEL specific tweaks:' if (( $G_HW_MODEL != 20 )); then @@ -1332,7 +1336,7 @@ _EOF_ #DietPi external USB drive. Power management settings. /dev/sda { - #10 mins + # 10 mins spindown_time = 120 # @@ -1424,7 +1428,7 @@ _EOF_ # - Ensure WiFi module pre-exists G_CONFIG_INJECT '8723bs' '8723bs' /etc/modules - #Rock64, remove HW accell config, as its not currently functional: https://github.com/MichaIng/DietPi/issues/2086 + # Rock64, remove HW accell config, as its not currently functional: https://github.com/MichaIng/DietPi/issues/2086 elif (( $G_HW_MODEL == 43 )); then [[ -f /etc/X11/xorg.conf.d/20-armsoc.conf ]] && rm /etc/X11/xorg.conf.d/20-armsoc.conf @@ -1473,16 +1477,16 @@ _EOF_ G_DIETPI-NOTIFY 2 'Running general cleanup of misc files' # - Remove Bash history file - [[ -f ~/.bash_history ]] && rm ~/.bash_history + [[ -f /root/.bash_history ]] && rm /root/.bash_history rm -f /home/*/.bash_history # - Remove Nano history file - [[ -f ~/.nano_history ]] && rm ~/.nano_history + [[ -f /root/.nano_history ]] && rm /root/.nano_history rm -f /home/*/.nano_history G_DIETPI-NOTIFY 2 'Removing swapfile from image' - /DietPi/dietpi/func/dietpi-set_dphys-swapfile 0 /var/swap + /DietPi/dietpi/func/dietpi-set_swapfile 0 /var/swap [[ -e /var/swap ]] && rm /var/swap # still exists on some images... # - re-enable for next run @@ -1528,8 +1532,7 @@ _EOF_ l_message='Detecting additional OS installed on system' G_RUN_CMD os-prober # - Native PC/EFI (assume x86_64 only possible) - if dpkg-query -s 'grub-efi-amd64' &> /dev/null && - [[ -d '/boot/efi' ]]; then + if dpkg-query -s 'grub-efi-amd64' &> /dev/null && [[ -d '/boot/efi' ]]; then l_message='Recreating GRUB-EFI' G_RUN_CMD grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck @@ -1540,8 +1543,8 @@ _EOF_ G_CONFIG_INJECT 'GRUB_CMDLINE_LINUX_DEFAULT=' 'GRUB_CMDLINE_LINUX_DEFAULT="consoleblank=0 quiet"' /etc/default/grub G_CONFIG_INJECT 'GRUB_CMDLINE_LINUX=' 'GRUB_CMDLINE_LINUX="net.ifnames=0"' /etc/default/grub - G_CONFIG_INJECT 'GRUB_TIMEOUT=' 'GRUB_TIMEOUT=3' /etc/default/grub - l_message='Finalizing GRUB' G_RUN_CMD update-grub + G_CONFIG_INJECT 'GRUB_TIMEOUT=' 'GRUB_TIMEOUT=0' /etc/default/grub + l_message='Finalising GRUB' G_RUN_CMD update-grub fi @@ -1615,7 +1618,7 @@ _EOF_ else - l_message='Enabling dietpi-fs_partition_resize for first boot' G_RUN_CMD systemctl enable dietpi-fs_partition_resize + l_message='Enabling automated partition and file system resize for first boot' G_RUN_CMD systemctl enable dietpi-fs_partition_resize fi @@ -1646,7 +1649,7 @@ _EOF_ rm -Rf /var/log/{,.??,.[^.]}* mount /var/log # Prevent new log files from being written to disk by background processes - cd ~ + cd /root umount /tmp rm -Rf /tmp/{,.??,.[^.]}* mount /tmp # Prevent new tmp files from being written to disk by background processes @@ -1673,16 +1676,15 @@ _EOF_ G_DIETPI-NOTIFY 0 'Completed, disk can now be saved to .img for later use, or, reboot system to start first run of DietPi.' - #Power off system + # Power off system - #Read image + # Read image - #Resize rootfs partition to minimum size +50MB + # Resize rootfs partition to minimum size +50MB } #------------------------------------------------------------------------------------------------ - #Run Main #------------------------------------------------------------------------------------------------ diff --git a/README.md b/README.md index b25f6d8abc..b62e5e7db2 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ We are always looking for talented people who believe in the DietPi project, and Vote for new suggestions, feature-, software- or image requests, or add your own to our new FeatHub page: -[![Feature Requests](http://feathub.com/MichaIng/DietPi?format=svg)](http://feathub.com/MichaIng/DietPi) +[![Feature Requests](https://feathub.com/MichaIng/DietPi?format=svg)](https://feathub.com/MichaIng/DietPi) ## License @@ -190,10 +190,11 @@ along with this program. If not, see https://www.gnu.org/licenses/ Links to additional software used in DietPi and their source and build instructions where applicable: - [Linux kernel](https://github.com/torvalds/linux) -- [GNU operating sytem](https://www.gnu.org/) +- [GNU operating system](https://www.gnu.org/) - [Debian distribution](https://salsa.debian.org/) - [Raspberry](https://github.com/raspberrypi) [Pi](https://github.com/RPi-Distro) - [Odroid](https://github.com/hardkernel?tab=repositories) +- [Sparky](https://github.com/sparkysbc?tab=repositories) [SBC](https://github.com/sparky-sbc/sparky-test) - [FriendlyARM](https://github.com/friendlyarm?tab=repositories) - [X.Org-X-Server](https://www.x.org/archive//individual/) - [LXDE desktop](https://github.com/LXDE) diff --git a/dietpi.txt b/dietpi.txt index 9d4d78b3f6..444e381da5 100644 --- a/dietpi.txt +++ b/dietpi.txt @@ -7,17 +7,17 @@ #------------------------------------------------------------------------------------------------------ # D I E T - P I -# DietPi-Automation settings, applied on the 1st boot of DietPi, ONCE +# DietPi-Automation settings, applied on 1st boot of DietPi only, ONCE! #------------------------------------------------------------------------------------------------------ ##### Networking Options ##### -# If both Ethernet and Wifi are enabled, Wifi will take priority and Ethernet will be disabled. +# If both Ethernet and WiFi are enabled, WiFi will take priority and Ethernet will be disabled. # 1=enabled AUTO_SETUP_NET_ETHERNET_ENABLED=1 AUTO_SETUP_NET_WIFI_ENABLED=0 -# If using WiFi, please edit the following to pre-enter creds /boot/dietpi-wifi.txt +# If using WiFi, please edit dietpi-wifi.txt to pre-enter credentials. # Enter your Static Network details below, if applicable. AUTO_SETUP_NET_USESTATIC=0 @@ -153,9 +153,8 @@ CONFIG_CPU_ONDEMAND_SAMPLE_RATE=25000 #sampling rate * down factor / 1000 = Milliseconds (40 = 1000ms when sampling rate is 25000) CONFIG_CPU_ONDEMAND_SAMPLE_DOWNFACTOR=80 -#Proxy settings | System-wide proxy settings. Use dietpi-config > networking options to apply. -# NB: Do not modify, you must use dietpi-config to configure/set options -CONFIG_PROXY_ENABLED=0 +#Proxy settings | System-wide proxy settings +# NB: Do not modify, you must use dietpi-config > "Network Options: Adapters" to apply CONFIG_PROXY_ADDRESS=MyProxyServer.com CONFIG_PROXY_PORT=8080 CONFIG_PROXY_USERNAME= @@ -164,9 +163,16 @@ CONFIG_PROXY_PASSWORD= #Delay boot until network is established: 0=disabled | 1=10 second wait max (default) | 2=infinite wait CONFIG_BOOT_WAIT_FOR_NETWORK=1 +#Connection timeout, before DietPi G_CHECK_URL assumes the URL is dead. Increase if you have a "flaky" connection or slow DNS resolver. +# NB: Set this to "0" to allow unlimited time, however this is not recommended to avoid unlimited hanging background scripts, e.g. daily DietPi update check. +CONFIG_G_CHECK_URL_TIMEOUT=5 +#Connection attempts with above timeout each, before DietPi G_CHECK_URL is giving up and prompts an error. +# NB: Set this to "0" to disable URL checking completely, however this is not recommended to avoid harder to debug follow-up errors during APT and download attempts. +CONFIG_G_CHECK_URL_ATTEMPTS=3 + #DietPi checks for updates (allows dietpi to check for updates on a daily basis and boot using a <1kb file download.) CONFIG_CHECK_DIETPI_UPDATES=1 -# Optional: Automatically update DietPi when updates are available. | requires CONFIG_CHECK_DIETPI_UPDATES=1 +# Optional: Automatically update DietPi when updates are available. | requires CONFIG_CHECK_DIETPI_UPDATES=1 CONFIG_AUTO_DIETPI_UPDATES=0 #NTPD Update Mode: 0=disabled | 1=boot only | 2=boot + daily | 3=boot + hourly | 4=Daemon + Drift diff --git a/dietpi/boot b/dietpi/boot index d2ddd649dc..09a1dd27ff 100644 --- a/dietpi/boot +++ b/dietpi/boot @@ -109,7 +109,7 @@ if (( $G_DIETPI_INSTALL_STAGE == 10 )); then # - Set swap - /DietPi/dietpi/func/dietpi-set_dphys-swapfile $(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') "$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=' /DietPi/dietpi.txt | sed 's/^[^=]*=//')" + /DietPi/dietpi/func/dietpi-set_swapfile $(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') "$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=' /DietPi/dietpi.txt | sed 's/^[^=]*=//')" # - Run survey [[ -f /DietPi/dietpi/.dietpi-survey ]] && rm /DietPi/dietpi/.dietpi-survey diff --git a/dietpi/dietpi-autostart b/dietpi/dietpi-autostart index fa97aa9b36..58c02ca4c8 100644 --- a/dietpi/dietpi-autostart +++ b/dietpi/dietpi-autostart @@ -16,16 +16,15 @@ # - dietpi-autostart int (set value only) #//////////////////////////////////// - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals G_PROGRAM_NAME='DietPi-Autostart' G_CHECK_ROOT_USER G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- - #Grab Input (valid integer) - INPUT=-1 - disable_error=1 G_CHECK_VALIDINT "$1" && INPUT=$1 + # Grab Input (valid integer) + disable_error=1 G_CHECK_VALIDINT "$1" && INPUT=$1 || INPUT=-1 #///////////////////////////////////////////////////////////////////////////////////// # MENUS @@ -36,12 +35,12 @@ Apply_Boot_Index(){ - # - Always disable LightDM + # Disable all autostart options first + # - LightDM systemctl disable lightdm &> /dev/null - # - Amiberry | always disable services, service launched by DietPi/login if non fastboot mode + # - Amiberry systemctl disable amiberry &> /dev/null - if (( $G_HW_MODEL < 10 )); then sed -i '/^[[:blank:]]*boot_delay=0/d' /DietPi/config.txt @@ -51,49 +50,54 @@ fi - # - Disable custom launch service + # - Custom script + systemctl disable dietpi-autostart_custom &> /dev/null [[ -f /etc/systemd/system/dietpi-autostart_custom.service ]] && rm /etc/systemd/system/dietpi-autostart_custom.service - # - Disable auto login + # - Auto login local fp_svc='/etc/systemd/system/getty@tty1.service.d' if [[ -d $fp_svc ]]; then [[ -f $fp_svc/dietpi-autologin.conf ]] && rm $fp_svc/dietpi-autologin.conf - [[ $(ls -A $fp_svc) ]] || rmdir $fp_svc + rmdir --ignore-fail-on-non-empty $fp_svc fi #---------------------------------------------------------------------- - #Enable autoboot options - # Custom script, service without auto login: https://github.com/MichaIng/DietPi/issues/1024 + # Enable selected autostart option + # - Custom script, service without auto login: https://github.com/MichaIng/DietPi/issues/1024 if (( $AUTO_START_INDEX == 14 )); then cat << _EOF_ > /etc/systemd/system/dietpi-autostart_custom.service [Unit] Description=DietPi-Autostart (Custom /var/lib/dietpi/dietpi-autostart/custom.sh) -After=dietpi-boot.service dietpi-ramdisk.service dietpi-ramlog.service dietpi-postboot.service rc-local.service -Requires=dietpi-boot.service dietpi-ramdisk.service +Requisite=dietpi-boot.service +After=dietpi-boot.service dietpi-postboot.service rc-local.service +ConditionPathExists=/var/lib/dietpi/dietpi-autostart/custom.sh [Service] Type=idle -ExecStartPre=$(command -v echo) 'Starting DietPi-Autostart (Custom) script' +RemainAfterExit=yes +StandardOutput=tty ExecStartPre=$(command -v chmod) +x /var/lib/dietpi/dietpi-autostart/custom.sh +ExecStartPre=$(which echo) 'Starting DietPi-Autostart (Custom) script...' ExecStart=/var/lib/dietpi/dietpi-autostart/custom.sh -StandardOutput=tty -RemainAfterExit=yes [Install] WantedBy=multi-user.target _EOF_ - systemctl enable dietpi-autostart_custom - # Uae4arm special | fast boot via enabled service + # - Uae4arm special | fast boot via enabled service elif (( $AUTO_START_INDEX == 6 )); then systemctl enable amiberry - # - apply tweaks + # - Enable systemd-logind to have a login console ready after exiting AmiBerry from fastboot + systemctl unmask systemd-logind + systemctl enable systemd-logind &> /dev/null + + # - Apply tweaks if (( $G_HW_MODEL < 10 )); then G_CONFIG_INJECT 'boot_delay=' 'boot_delay=0' /DietPi/config.txt @@ -103,7 +107,7 @@ _EOF_ fi - # Enable auto login + # - Enable auto login elif (( $AUTO_START_INDEX > 0 )); then mkdir -p /etc/systemd/system/getty@tty1.service.d @@ -120,17 +124,17 @@ _EOF_ fi - #Save boot index, if not default 0 + # Save boot index, if not default 0 (( $AUTO_START_INDEX )) && echo $AUTO_START_INDEX > /DietPi/dietpi/.dietpi-autostart_index systemctl daemon-reload } - #TARGETMENUID=0 + # TARGETMENUID=0 Menu_Main(){ - #existing boot flag + # Existing boot flag [[ -f /DietPi/dietpi/.dietpi-autostart_index ]] && AUTO_START_INDEX=$( -1 )); do @@ -240,7 +242,7 @@ _EOF_ done - #Apply boot index + # Apply boot index elif (( $INPUT >= 0 )); then AUTO_START_INDEX=$INPUT diff --git a/dietpi/dietpi-config b/dietpi/dietpi-config index 7305c4a64c..939d709d3b 100644 --- a/dietpi/dietpi-config +++ b/dietpi/dietpi-config @@ -17,15 +17,15 @@ # - iEXITONBACK - 1=Exit DietPi-Config when going back to previous menu (applied to TARGETMENUINDEX 8 only!!) #//////////////////////////////////// - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals G_PROGRAM_NAME='DietPi-Config' G_CHECK_ROOT_USER G_CHECK_ROOTFS_RW G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- - #Grab Inputs + # Grab Inputs # - target MENU INDEX (valid interger) disable_error=1 G_CHECK_VALIDINT "$1" && TARGETMENUID=$1 @@ -38,29 +38,20 @@ fi #///////////////////////////////////////////////////////////////////////////////////// - #Obtain Hardware Details + # Obtain Hardware Details #///////////////////////////////////////////////////////////////////////////////////// HW_ONBOARD_WIFI=$(sed -n 10p /DietPi/dietpi/.hw_model) FP_CPU_SCALING_GOV='/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors' #///////////////////////////////////////////////////////////////////////////////////// - #Obtain Installed software + # Obtain Installed software #///////////////////////////////////////////////////////////////////////////////////// - Load_Installed_Software(){ - - [[ -f /DietPi/dietpi/.installed ]] && . /DietPi/dietpi/.installed - - } + Load_Installed_Software(){ [[ -f /DietPi/dietpi/.installed ]] && . /DietPi/dietpi/.installed; } #///////////////////////////////////////////////////////////////////////////////////// - #Whiltail Info + # Whiltail Info #///////////////////////////////////////////////////////////////////////////////////// - HW_MSG_NOTSUPPORTED='Not Supported' - Info_HW_OptionNotSupported(){ - - G_WHIP_MSG "This option is not available for $G_HW_MODEL_DESCRIPTION" - - } + Info_HW_OptionNotSupported(){ G_WHIP_MSG "This option is not available for $G_HW_MODEL_DESCRIPTION"; } #///////////////////////////////////////////////////////////////////////////////////// # MENUS @@ -73,11 +64,11 @@ REBOOT_REQUIRED=0 - #Interger min/max value holders + # Interger min/max value holders MIN_VALUE=0 MAX_VALUE=0 - #TARGETMENUID=0 + # TARGETMENUID=0 Menu_Main(){ G_WHIP_MENU_ARRAY=('1' ': Display Options') @@ -159,7 +150,7 @@ Menu_Exit(){ - # TARGETMENUID = -1 , if we are to exit the menu + # TARGETMENUID=-1, if we are to exit DietPi-Config G_WHIP_SIZE_X_MAX=50 if G_WHIP_YESNO "Exit $G_PROGRAM_NAME?"; then @@ -212,7 +203,7 @@ } - #TARGETMENUID=1 + # TARGETMENUID=1 Menu_DisplayOptions(){ TARGETMENUID=0 @@ -238,7 +229,7 @@ fi - #Display brightness + # Display brightness G_WHIP_MENU_ARRAY+=('16' ': Display Brightness') local xorg_dpi_current=$(grep -m1 '^[[:blank:]]*SOFTWARE_XORG_DPI=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') @@ -246,7 +237,7 @@ (( $G_HW_MODEL != 20 )) && G_WHIP_MENU_ARRAY+=('14' ': LED Control') - #RPi only + # RPi only if (( $G_HW_MODEL < 10 )); then # HDMI rotation @@ -262,7 +253,7 @@ local overscan_text='[On]' (( $overscan_disabled )) && overscan_text='[Off]' G_WHIP_MENU_ARRAY+=('6' ": Overscan : $overscan_text") - # - Overscan sizes + # - Overscan sizes if (( ! $overscan_disabled )); then local overscan_options=( @@ -319,7 +310,7 @@ fi - #Odroid Remote + # Odroid Remote if (( $G_HW_MODEL >= 10 && $G_HW_MODEL <= 12 )); then local odroid_remote_text='[Off]' @@ -339,8 +330,7 @@ if G_WHIP_MENU 'Please select an option:'; then - #Return to this menu - TARGETMENUID=1 + TARGETMENUID=1 # Return to this menu WHIP_SELECTION_PREVIOUS=$G_WHIP_RETURNED_VALUE @@ -372,9 +362,7 @@ # RPi and Odroids only if (( $G_HW_MODEL < 20 )); then - G_WHIP_MENU_ARRAY=() - - G_WHIP_MENU_ARRAY+=('none' ': Uninstall all panels') + G_WHIP_MENU_ARRAY=('none' ': Uninstall all panels') G_WHIP_MENU_ARRAY+=('waveshare32' ': 320x240 panel with touch input') if (( $G_HW_MODEL < 10 )); then @@ -406,7 +394,7 @@ if (( $G_HW_MODEL < 10 || $G_HW_MODEL == 10 || $G_HW_MODEL == 12 )); then - G_WHIP_MSG 'GPU/RAM Memory splits are pre-configured and applied during DietPi-Software setup. \n \nThe split value is optimized based on your software installs, however, feel free to tweak them.' + G_WHIP_MSG 'GPU/RAM Memory splits are pre-configured and applied during DietPi-Software setup.\n\nThe split value is optimized based on your software installs, however, feel free to tweak them.' TARGETMENUID=6 else @@ -417,7 +405,7 @@ elif (( $G_WHIP_RETURNED_VALUE == 6 )); then - #RPI only + # RPi only if (( $G_HW_MODEL < 10 )); then if (( $overscan_disabled )); then @@ -445,7 +433,7 @@ elif (( $G_WHIP_RETURNED_VALUE == 7 )); then - #RPI only + # RPi only if (( $G_HW_MODEL < 10 )); then G_WHIP_MENU_ARRAY=( @@ -479,7 +467,7 @@ elif (( $G_WHIP_RETURNED_VALUE == 8 )); then - #RPI only + # RPi only if (( $G_HW_MODEL < 10 )); then if (( $rpi_camera_module_enabled )); then @@ -501,17 +489,15 @@ elif (( $G_WHIP_RETURNED_VALUE == 9 )); then - #RPI only + # RPi only if (( $G_HW_MODEL < 10 )); then if (( $rpi_camera_led_disabled )); then - #disable G_CONFIG_INJECT 'disable_camera_led=' 'disable_camera_led=0' /DietPi/config.txt else - #enable G_CONFIG_INJECT 'disable_camera_led=' 'disable_camera_led=1' /DietPi/config.txt fi @@ -525,7 +511,6 @@ elif (( $G_WHIP_RETURNED_VALUE == 10 )); then - # - Enable if (( $odroid_remote_enabled )); then /DietPi/dietpi/func/dietpi-set_hardware remoteir none @@ -540,12 +525,10 @@ fi fi - REBOOT_REQUIRED=1 elif (( $G_WHIP_RETURNED_VALUE == 11 )); then - # - Enable if (( $justboom_ir_remote_enabled )); then /DietPi/dietpi/func/dietpi-set_hardware remoteir none @@ -560,7 +543,6 @@ fi fi - REBOOT_REQUIRED=1 elif (( $G_WHIP_RETURNED_VALUE == 12 )); then @@ -570,7 +552,7 @@ G_CONFIG_INJECT 'decode_WVC1=' "decode_WVC1=$G_WHIP_RETURNED_VALUE" /DietPi/config.txt - #https://github.com/MichaIng/DietPi/issues/1487 + # https://github.com/MichaIng/DietPi/issues/1487 local current_gpu_mem=$(grep -m1 '^[[:blank:]]*gpu_mem_1024' /DietPi/config.txt | sed 's/^[^=]*=//g') (( $current_gpu_mem < 128 )) && /DietPi/dietpi/func/dietpi-set_hardware gpumemsplit 128 @@ -585,7 +567,7 @@ G_CONFIG_INJECT 'decode_MPG2=' "decode_MPG2=$G_WHIP_RETURNED_VALUE" /DietPi/config.txt - #https://github.com/MichaIng/DietPi/issues/1487 + # https://github.com/MichaIng/DietPi/issues/1487 local current_gpu_mem=$(grep -m1 '^[[:blank:]]*gpu_mem_1024' /DietPi/config.txt | sed 's/^[^=]*=//g') (( $current_gpu_mem < 128 )) && /DietPi/dietpi/func/dietpi-set_hardware gpumemsplit 128 @@ -612,18 +594,17 @@ G_CONFIG_INJECT 'display_hdmi_rotate=' "display_hdmi_rotate=$G_WHIP_RETURNED_VALUE" /DietPi/config.txt - # rotation 90/270 | invert x/y on FB (Y > X) + # rotation 90/270 | invert x/y on FB (Y > X) if [[ $G_WHIP_RETURNED_VALUE == '1' || $G_WHIP_RETURNED_VALUE == '3' ]]; then Display_Rotation_Calc_XY_Invert 1 - # X > Y + # X > Y else Display_Rotation_Calc_XY_Invert 0 fi - REBOOT_REQUIRED=1 fi @@ -683,14 +664,10 @@ G_WHIP_DEFAULT_ITEM=$current_brightness G_WHIP_INPUTBOX "Please enter a brightness value:\n - Min = $MIN_VALUE | Max = $MAX_VALUE" - if (( $? == 0 )) && [[ $G_WHIP_RETURNED_VALUE ]]; then + if (( $? == 0 )) && G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" $MIN_VALUE $MAX_VALUE; then - if G_CHECK_VALIDINT $G_WHIP_RETURNED_VALUE $MIN_VALUE $MAX_VALUE; then - - # - apply - echo $G_WHIP_RETURNED_VALUE > $fp_brightness/brightness - - fi + # - apply + echo $G_WHIP_RETURNED_VALUE > $fp_brightness/brightness fi @@ -700,8 +677,6 @@ fi - unset afp_current_set_brightness - elif (( $G_WHIP_RETURNED_VALUE == 17 )); then G_WHIP_MENU_ARRAY=( @@ -731,8 +706,6 @@ fi - unset overscan_options - } Xorg_Configure(){ @@ -743,19 +716,18 @@ \nWould you like to continue?"; then G_RUN_CMD Xorg -configure - mv $HOME/xorg.conf.new /etc/X11/xorg.conf + mv /root/xorg.conf.new /etc/X11/xorg.conf fi } - #TARGETMENUID=2 + # TARGETMENUID=2 Menu_DisplayOptions_Driver_Resolution(){ - #Return to Display Options Menu - TARGETMENUID=1 + TARGETMENUID=1 # Return to Display Options menu - #VM + # VM if (( $G_HW_MODEL == 20 )); then local current=$(grep -m1 '^[[:blank:]]*GRUB_GFXMODE=' /etc/default/grub | sed 's/^[^=]*=//') @@ -793,7 +765,7 @@ fi - #Native PC + # Native PC elif (( $G_HW_MODEL == 21 )); then local nvidia_installed=0 @@ -836,18 +808,17 @@ /DietPi/dietpi/dietpi-software install 151 fi - REBOOT_REQUIRED=1 elif [[ $G_WHIP_RETURNED_VALUE == 'Intel' ]]; then if (( $intel_installed )); then - G_AGP xserver-xorg-video-intel #Must test removal deps... + G_AGP i965-va-driver xserver-xorg-video-intel else - G_AG_CHECK_INSTALL_PREREQ xserver-xorg-video-intel libgl1-mesa-dri + G_AG_CHECK_INSTALL_PREREQ i965-va-driver xserver-xorg-video-intel libgl1-mesa-dri Xorg_Configure fi @@ -856,7 +827,7 @@ fi - #RPI + # RPi elif (( $G_HW_MODEL < 10 )); then local framebuffer_x=$(grep -m1 '^[[:blank:]]*framebuffer_width=' /DietPi/config.txt || vcgencmd get_config framebuffer_width) @@ -900,8 +871,7 @@ REBOOT_REQUIRED=1 - #Return to This Menu - TARGETMENUID=2 + TARGETMENUID=2 # Return to this menu if [[ $G_WHIP_RETURNED_VALUE == 'Headless' ]]; then @@ -1015,10 +985,10 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Odroid C1 + # Odroid C1 elif (( $G_HW_MODEL == 10 )); then - #Get Current Values + # Get Current Values local current_resolution=$(mawk -F '"' '/setenv m "/ {print $2;exit}' /DietPi/boot.ini) G_WHIP_MENU_ARRAY=( @@ -1036,8 +1006,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 REBOOT_REQUIRED=1 - #Return to This Menu - TARGETMENUID=2 + TARGETMENUID=2 # Return to this menu # - Always reset to HDMI sed -i '/setenv vout_mode /c\setenv vout_mode "hdmi"' /DietPi/boot.ini @@ -1079,10 +1048,10 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Odroid xu3/4 + # Odroid XU3/4 elif (( $G_HW_MODEL == 11 )); then - #Get Current Values + # Get Current Values local current_resolution=$(grep -m1 'setenv videoconfig \"' /DietPi/boot.ini) if [[ $current_resolution == *'1920x1080'* ]]; then @@ -1112,8 +1081,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 REBOOT_REQUIRED=1 - #Return to This Menu - TARGETMENUID=2 + TARGETMENUID=2 # Return to this menu # - Always reset to hdmi sed -i '/setenv vout /c\setenv vout "hdmi"' /DietPi/boot.ini @@ -1127,10 +1095,10 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Odroid C2 + # Odroid C2 elif (( $G_HW_MODEL == 12 )); then - #Get Current Values + # Get Current Values local current_resolution=$(mawk -F '"' '/setenv m "/ {print $2;exit}' /DietPi/boot.ini | sed 's/p/p /') # - NB: also added space after xxxp, so its easier to read, and selects default item. @@ -1158,11 +1126,11 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 [[ $current_resolution != $G_WHIP_RETURNED_VALUE ]] && REBOOT_REQUIRED=1 - # - Always reset vga/dvi options + # Always reset vga/dvi options sed -i '/setenv vout "dvi"/c\# setenv vout "dvi"' /DietPi/boot.ini sed -i '/setenv vout "vga"/c\# setenv vout "vga"' /DietPi/boot.ini - #DVI / VU7+ + # DVI / VU7+ if [[ $G_WHIP_RETURNED_VALUE == '1024x600p 60hz' ]]; then # + DVI mode @@ -1170,20 +1138,19 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Remove the space from option - local temp_string=$(echo "$G_WHIP_RETURNED_VALUE" | tr -d '[:blank:]') + # Remove the space from option + local temp_string=${G_WHIP_RETURNED_VALUE//[[:blank:]]/} sed -i "/setenv m /c\setenv m \"$temp_string\"" /DietPi/boot.ini - #Return to This Menu - TARGETMENUID=2 + TARGETMENUID=2 # Return to this menu fi - #Pine a64 + # Pine A64 elif (( $G_HW_MODEL == 40 )); then - #Get Current Values + # Get Current Values local current_resolution=$(grep -m1 '^[[:blank:]]*hdmi_mode=' /DietPi/uEnv.txt | sed 's/^[^=]*=//') [[ $current_resolution ]] || current_resolution='Not set' @@ -1212,8 +1179,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Return to This Menu - TARGETMENUID=2 + TARGETMENUID=2 # Return to this menu fi @@ -1225,21 +1191,93 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 } - #TARGETMENUID=3 - Menu_AdvancedOptions(){ + # TARGETMENUID=18 + Menu_AdvancedOptions_Serial_UART(){ - TARGETMENUID=0 + TARGETMENUID=18 # Return to this menu + declare -A aSTATE=() G_WHIP_MENU_ARRAY=() - #Swap file + (( $G_HW_MODEL < 10 )) && G_WHIP_MENU_ARRAY+=('' '●─ Toggle console ') + for i in /dev/tty{S,AMA,SAC}[0-9] + do + + [[ -e $i ]] || continue + i=${i#/dev/} + aSTATE[$i]='[Off]' + systemctl -q is-active serial-getty@$i && aSTATE[$i]='[On]' + G_WHIP_MENU_ARRAY+=("$i console" ": ${aSTATE[$i]}") + + done + + # RPi special + local rpi_text='' + if (( $G_HW_MODEL < 10 )); then + + local rpi_text='\n\nOn Raspberry Pi you can additionally enable or disable the primary UART device completely (requires reboot).' + G_WHIP_MENU_ARRAY+=('' '●─ Toggle device ') + + # Onboard WiFi/BT: "enable_uart" toggles ttyS0 (mini UART), disabled by default + if (( $(sed -n 9p /DietPi/dietpi/.hw_model) )); then + + local rpi_uart='ttyS0 (mini UART)' + local rpi_uart_state='[Off]' + grep -q '^[[:blank:]]*enable_uart=1' /DietPi/config.txt && rpi_uart_state='[On]' + + # Nonboard WiFi/BT: "enable_uart" toggles ttyAMA0 (full UART). enabled by default + else + + local rpi_uart='ttyAMA0 (full UART)' + local rpi_uart_state='[On]' + grep -q '^[[:blank:]]*enable_uart=0' /DietPi/config.txt && rpi_uart_state='[Off]' + + fi + G_WHIP_MENU_ARRAY+=("$rpi_uart device" ': $rpi_uart_state') + + fi + + (( ${#G_WHIP_MENU_ARRAY[@]} > 2 )) || { G_WHIP_MSG 'No serial/UART devices have been found on your system.'; TARGETMENUID=3; return; } + + G_WHIP_BUTTON_CANCEL_TEXT='Back' + if G_WHIP_MENU "Select an available serial/UART device to toggle a login console on it.$rpi_text"; then + + if [[ $G_WHIP_RETURNED_VALUE == *'device' ]]; then + + local toggle=1 + [[ $rpi_uart_state == '[On]' ]] && toggle=0 && /DietPi/dietpi/func/dietpi-set_hardware serialconsole disable ${G_WHIP_RETURNED_VALUE%% *} + G_CONFIG_INJECT 'enable_uart=' "enable_uart=$toggle" /DietPi/config.txt + REBOOT_REQUIRED=1 + + elif [[ $G_WHIP_RETURNED_VALUE == *'console' ]]; then + + local toggle='enable' + [[ ${aSTATE[${G_WHIP_RETURNED_VALUE%% *}]} == '[On]' ]] && toggle='disable' + /DietPi/dietpi/func/dietpi-set_hardware serialconsole $toggle ${G_WHIP_RETURNED_VALUE%% *} + + fi + + else + + TARGETMENUID=3 # Return to Advanced Options + + fi + + } + + # TARGETMENUID=3 + Menu_AdvancedOptions(){ + + TARGETMENUID=0 + + # Swap file local swap_size=$(free -m | mawk '/Swap:/ {print $2;exit}') local swap_location=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') local swap_size_text="$swap_size MB" - (( ! $swap_size )) && swap_size_text='[Off]' - G_WHIP_MENU_ARRAY+=('Swapfile' ": [$swap_size_text | $swap_location]") + (( $swap_size )) || swap_size_text='[Off]' + G_WHIP_MENU_ARRAY=('Swapfile' ": [$swap_size_text | $swap_location]") - #Time sync + # Time sync local ntpd_mode_current=$(grep -m1 '^[[:blank:]]*CONFIG_NTP_MODE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') local ntpd_mode_text='' if (( $ntpd_mode_current == 0 )); then @@ -1265,29 +1303,25 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi G_WHIP_MENU_ARRAY+=('Time sync mode' ": [$ntpd_mode_text]") - local rtc_enabled=0 - local rtc_text='Emulated' - if ! command -v fake-hwclock &> /dev/null; then + # RTC clock + local rtc_enabled=1 + local rtc_text='Hardware' + if command -v fake-hwclock &> /dev/null; then - rtc_enabled=1 - rtc_text='Hardware' + rtc_enabled=0 + rtc_text='Emulated' fi - G_WHIP_MENU_ARRAY+=('RTC mode' ": [$rtc_text]") G_WHIP_MENU_ARRAY+=('Update firmware' '') - #No bluetooth and serial console for VM - if (( $G_HW_MODEL != 20 )); then + # Serial/UART devices + G_WHIP_MENU_ARRAY+=('Serial/UART' ': Manage available devices') - #Serial console - local serialconsole_state=$(grep -m1 '^[[:blank:]]*CONFIG_SERIAL_CONSOLE_ENABLE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') - local serialconsole_text='[Off]' - (( $serialconsole_state )) && serialconsole_text='[On]' - G_WHIP_MENU_ARRAY+=('Serial console' ": $serialconsole_text") + # Bluetooth: Not for VM + if (( $G_HW_MODEL != 20 )); then - #Bluetooth local bluetooth_state_text='[On]' local bluetooth_state=1 if [[ -f /etc/modprobe.d/disable_bt.conf ]]; then @@ -1300,40 +1334,42 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #RPi Specific + # RPi specific if (( $G_HW_MODEL < 10 )); then + # I2C state local rpi_i2c_enabled=$(grep -ci -m1 '^[[:blank:]]*dtparam=i2c_arm=on' /DietPi/config.txt) local rpi_i2c_text='[Off]' (( $rpi_i2c_enabled )) && rpi_i2c_text='[On]' + G_WHIP_MENU_ARRAY+=('I2C state' ": $rpi_i2c_text") + # I2C baudrate local rpi_i2cbaudrate_hz=$(grep -m1 '^[[:blank:]]*i2c_arm_baudrate=' /DietPi/config.txt | sed 's/^[^=]*=//') - # Allow commented/non-existent entry, using default value: https://github.com/raspberrypi/firmware/blob/d69aadedb7c146ba5d3b0b45a661e5669a9141c4/boot/overlays/README#L115-L116 + # - Allow commented/non-existent entry, using default value: https://github.com/raspberrypi/firmware/blob/d69aadedb7c146ba5d3b0b45a661e5669a9141c4/boot/overlays/README#L115-L116 rpi_i2cbaudrate_hz="$(( ${rpi_i2cbaudrate_hz:-100000} / 1000 )) kHz" + G_WHIP_MENU_ARRAY+=('I2C frequency' ": [$rpi_i2cbaudrate_hz]") + + # USB max current local usb_max_current_enabled=$(grep -ci -m1 '^[[:blank:]]*max_usb_current=1' /DietPi/config.txt) local rpi_usbmaxcurrent_text='[Off]' (( $usb_max_current_enabled )) && rpi_usbmaxcurrent_text='[On]' + G_WHIP_MENU_ARRAY+=('Max USB current' ": $rpi_usbmaxcurrent_text") - if (( $G_HW_MODEL == 3 )); then + # USB boot option: RPi3 only and not required for RPi3+: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md + if (( $G_HW_MODEL == 3 )) && [[ $G_HW_MODEL_DESCRIPTION == *'3 Model '[AB]'+' ]]; then local rpi3_usb_boot_bit_enabled=$(vcgencmd otp_dump | grep -m1 '17:' | grep -ci -m1 '3020000a') local rpi3_usb_boot_bit_enabled_text='[Off]' (( $rpi3_usb_boot_bit_enabled )) && rpi3_usb_boot_bit_enabled_text='[On]' - G_WHIP_MENU_ARRAY+=('USB boot support' ": $rpi3_usb_boot_bit_enabled_text") fi - G_WHIP_MENU_ARRAY+=('Max USB current' ": $rpi_usbmaxcurrent_text") - G_WHIP_MENU_ARRAY+=('I2c state' ": $rpi_i2c_text") - G_WHIP_MENU_ARRAY+=('I2c frequency' ": [$rpi_i2cbaudrate_hz]") - fi if G_WHIP_MENU 'Please select an option:'; then - #Return to This Menu - TARGETMENUID=3 + TARGETMENUID=3 # Return to this menu if [[ $G_WHIP_RETURNED_VALUE == 'Swapfile' ]]; then @@ -1356,7 +1392,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 systemctl stop fake-hwclock - # - allow times in the past + # - Allow times in the past G_CONFIG_INJECT 'FORCE=' 'FORCE=force' /etc/default/fake-hwclock systemctl restart fake-hwclock @@ -1391,8 +1427,8 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 local old_firmware=$(ls /lib/modules/) - #PineA64 - if (( $G_HW_MODEL == 40 )); then + # Pine A64: Non-ARMbian only + if (( $G_HW_MODEL == 40 && -f /usr/local/sbin/pine64_update_uboot.sh && -f /usr/local/sbin/pine64_update_kernel.sh )); then if G_WHIP_YESNO "Would you like to update the firmware/kernel for $G_HW_MODEL_DESCRIPTION? - This will run longsleep's update scripts to update the U-Boot and kernel."; then @@ -1402,7 +1438,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #G_AGDUG based (not all devices support this) + # G_AGDUG based (not all devices support this) elif G_WHIP_YESNO "Would you like to update the firmware/kernel for $G_HW_MODEL_DESCRIPTION? - This will run G_AGDUG, a wrapper for 'apt-get dist-upgrade'\n - Most (but not all) devices allow APT based firmware updates \nNB: If requested to overwrite the current kernel, press TAB and then ENTER (to confirm)."; then @@ -1412,12 +1448,12 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Reboot required only, if firmware got actually updated + # Reboot required only, if firmware got actually updated [[ $old_firmware != $(ls /lib/modules/) ]] && REBOOT_REQUIRED=1 elif [[ $G_WHIP_RETURNED_VALUE == 'Max USB current' ]]; then - #Enabled + # Enabled if (( $usb_max_current_enabled == 1 )); then if G_WHIP_YESNO "Current setting: $rpi_usbmaxcurrent_text (1.2AMP)\nWould you like to disable this setting? @@ -1428,7 +1464,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Disabled + # Disabled elif (( $usb_max_current_enabled == 0 )); then if G_WHIP_YESNO "Current setting: $rpi_usbmaxcurrent_text (0.6AMP)\nWould you like to enable this setting? @@ -1441,7 +1477,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - elif [[ $G_WHIP_RETURNED_VALUE == 'I2c state' ]]; then + elif [[ $G_WHIP_RETURNED_VALUE == 'I2C state' ]]; then if (( $rpi_i2c_enabled )); then @@ -1454,14 +1490,14 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi REBOOT_REQUIRED=1 - elif [[ $G_WHIP_RETURNED_VALUE == 'I2c frequency' ]]; then + elif [[ $G_WHIP_RETURNED_VALUE == 'I2C frequency' ]]; then - #remove kHz from current - G_WHIP_DEFAULT_ITEM=$(echo -e "$rpi_i2cbaudrate_hz" | tr -d ' kHz') - if G_WHIP_INPUTBOX 'Please enter the required i2c baudrate frequency (kHz).'; then + # Remove kHz from current + G_WHIP_DEFAULT_ITEM=${rpi_i2cbaudrate_hz% kHz} + if G_WHIP_INPUTBOX 'Please enter the required I2C baudrate frequency (kHz).'; then - #check valid int - if G_CHECK_VALIDINT $G_WHIP_RETURNED_VALUE; then + # Check valid int + if G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE"; then /DietPi/dietpi/func/dietpi-set_hardware i2c "$G_WHIP_RETURNED_VALUE" REBOOT_REQUIRED=1 @@ -1470,18 +1506,9 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - elif [[ $G_WHIP_RETURNED_VALUE == 'Serial console' ]]; then + elif [[ $G_WHIP_RETURNED_VALUE == 'Serial/UART' ]]; then - if (( $serialconsole_state )); then - - /DietPi/dietpi/func/dietpi-set_hardware serialconsole disable - - else - - /DietPi/dietpi/func/dietpi-set_hardware serialconsole enable - - fi - REBOOT_REQUIRED=1 + TARGETMENUID=18 elif [[ $G_WHIP_RETURNED_VALUE == 'Bluetooth' ]]; then @@ -1520,35 +1547,27 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 } - #TARGETMENUID=4 + # TARGETMENUID=4 Menu_PerformanceOptions(){ TARGETMENUID=0 - #All devices + # All devices local current_cpu_governor=$(grep -m1 '^[[:blank:]]*CONFIG_CPU_GOVERNOR=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') local frequency_min_cpu_governor=1 local fp_frequency_min_cpu_governor='/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq' - if [[ -f $fp_frequency_min_cpu_governor ]]; then - - frequency_min_cpu_governor=$(( $(<$fp_frequency_min_cpu_governor) / 1000 )) - - fi + [[ -f $fp_frequency_min_cpu_governor ]] && frequency_min_cpu_governor=$(( $(<$fp_frequency_min_cpu_governor) / 1000 )) local frequency_max_cpu_governor=2 local fp_frequency_max_cpu_governor='/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq' - if [[ -f $fp_frequency_max_cpu_governor ]]; then - - frequency_max_cpu_governor=$(( $(<$fp_frequency_max_cpu_governor) / 1000 )) - - fi + [[ -f $fp_frequency_max_cpu_governor ]] && frequency_max_cpu_governor=$(( $(<$fp_frequency_max_cpu_governor) / 1000 )) local cpu_temp=$(G_OBTAIN_CPU_TEMP) local cpu_temp_f='Unknown' if disable_error=1 G_CHECK_VALIDINT "$cpu_temp"; then - cpu_temp_f="$(( ( $cpu_temp * 9 / 5 ) + 32 ))'f" + cpu_temp_f="$(( $cpu_temp * 9/5 + 32 ))'f" cpu_temp+="'c" fi @@ -1557,17 +1576,17 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 local memory_free=$(( $(mawk '/MemFree:/ {print $2;exit}' /proc/meminfo) / 1000 )) local memory_usage=$(( $memory_total - $memory_free )) - #Create Menu List for Whiptail + # Create Menu List for Whiptail # - this will list the menu options available for each device. G_WHIP_MENU_ARRAY=() - #RPi: Overclocking + # RPi: Overclocking (( $G_HW_MODEL < 10 )) && G_WHIP_MENU_ARRAY+=('Overclocking' ': Set Profile') - #CPU GOV + # CPU GOV G_WHIP_MENU_ARRAY+=('CPU Governor' ": [$current_cpu_governor]") - #Ondemand/Interactive Throttle up menu + # Ondemand/Interactive Throttle up menu if [[ $current_cpu_governor == 'ondemand' || $current_cpu_governor == 'conservative' || $current_cpu_governor == 'interactive' ]]; then @@ -1577,7 +1596,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Ondemand extras + # Ondemand extras if [[ $current_cpu_governor == 'ondemand' ]]; then local current_cpu_sample_rate=$(( $(grep -m1 '^[[:blank:]]*CONFIG_CPU_ONDEMAND_SAMPLE_RATE=' /DietPi/dietpi.txt | sed 's/[^=]*=//') / 1000 )) #convert to ms @@ -1589,7 +1608,18 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Define CPU scaling frequency or percent + #Intel boost option (eg: i5-6200U, disables 2.9GHz mode, limits to 2.3GHz) + local intel_boost_disabled=0 + local intel_boost_text='Enabled' + if grep -qi 'genuineintel' /proc/cpuinfo; then + + intel_boost_disabled=$(grep -m1 '^[[:blank:]]*CONFIG_CPU_DISABLE_TURBO=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + (( $intel_boost_disabled )) && intel_boost_text='Disabled' + G_WHIP_MENU_ARRAY+=('Intel Turbo/Boost' ": [$intel_boost_text]") + + fi + + # Define CPU scaling frequency or percent local type_cpu_freq_info='MHz' # - Intel [[ -f /sys/devices/system/cpu/intel_pstate/max_perf_pct ]] && type_cpu_freq_info='%' @@ -1606,7 +1636,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 G_WHIP_MENU_ARRAY+=('CPU Frequency Limits' ": Max = [$user_frequency_max_text] | Min = [$user_frequency_min_text]") - #RPi extras + # RPi extras if (( $G_HW_MODEL < 10 )); then local current_cpu_temp_limit=$(grep -m1 'temp_limit' /DietPi/config.txt | sed 's/^[^=]*=//') @@ -1622,11 +1652,19 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 G_WHIP_MENU "Hardware : $G_HW_MODEL_DESCRIPTION \nCPU Temp: $cpu_temp : $cpu_temp_f\nRAM: $memory_total MB | Used: $memory_usage MB | Free: $memory_free MB" if (( $? == 0 )); then - #Return to this menu - TARGETMENUID=4 + TARGETMENUID=4 # Return to this menu case "$G_WHIP_RETURNED_VALUE" in + 'Intel Turbo/Boost'*) + + (( intel_boost_disabled++ )) + (( $intel_boost_disabled > 1 )) && intel_boost_disabled=0 + G_CONFIG_INJECT 'CONFIG_CPU_DISABLE_TURBO=' "CONFIG_CPU_DISABLE_TURBO=$intel_boost_disabled" /DietPi/dietpi.txt + /DietPi/dietpi/func/dietpi-set_cpu + + ;; + 'Ondemand Down Factor'*) MIN_VALUE=1 @@ -1635,9 +1673,9 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 G_WHIP_INPUTBOX "After Ondemand throttles up, how long before the next sample to check if CPU clocks can be reduced.\n\n - This value * 'Ondemand Sample Rate' = total miliseconds\n - Lower values may help reduce power consumption, however, a 500-1000ms value is recommended to prevent excessive sampling.\n - Valid range: $MIN_VALUE - $MAX_VALUE\n\nIf unsure, set any value, 'Ondemand Down Factor' option on the next screen will list the calculated miliseconds." if (( $? == 0 )); then - if G_CHECK_VALIDINT $G_WHIP_RETURNED_VALUE $MIN_VALUE $MAX_VALUE; then + if G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" $MIN_VALUE $MAX_VALUE; then - sed -i "/CONFIG_CPU_ONDEMAND_SAMPLE_DOWNFACTOR=/c\CONFIG_CPU_ONDEMAND_SAMPLE_DOWNFACTOR=$G_WHIP_RETURNED_VALUE" /DietPi/dietpi.txt + G_CONFIG_INJECT 'CONFIG_CPU_ONDEMAND_SAMPLE_DOWNFACTOR=' "CONFIG_CPU_ONDEMAND_SAMPLE_DOWNFACTOR=$G_WHIP_RETURNED_VALUE" /DietPi/dietpi.txt /DietPi/dietpi/func/dietpi-set_cpu fi @@ -1648,8 +1686,8 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 'Ondemand Sample Rate'*) - local index=-1 - local input_fp=( + local file='' + local afile=( '/sys/devices/system/cpu/cpufreq/ondemand/sampling_rate_min' '/sys/devices/system/cpu/cpufreq/ondemand/min_sampling_rate' @@ -1658,46 +1696,38 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 ) - for ((i=0; i<${#input_fp[@]}; i++)) + for i in ${afile[@]} do - if [[ -f ${input_fp[$i]} ]]; then - - index=$i - break - - fi + [[ -f $i ]] && file=$i && break done - # - Unable to find min value, hard set it - if (( $index <= -1 )); then + if [[ $file ]]; then - MIN_VALUE=20 # RPi is min 20ms, however, no way to currently detect min available values... + MIN_VALUE=$(( $(<$file) / 1000 )) + # - Unable to find min value, hard set it else - MIN_VALUE=$(( $(<${input_fp[$index]}) / 1000 )) + MIN_VALUE=20 # RPi is min 20ms, however, no way to currently detect min available values... fi MAX_VALUE=300 G_WHIP_DEFAULT_ITEM=$current_cpu_sample_rate - G_WHIP_INPUTBOX "Please enter a sample rate in miliseconds, for Ondemand to check if it needs to increase CPU clocks.\nA lower value will make the system more responsive.\n - valid range: $MIN_VALUE - $MAX_VALUE" + G_WHIP_INPUTBOX "Please enter a sample rate in milliseconds, for Ondemand to check if it needs to increase CPU clocks.\nA lower value will make the system more responsive.\n - valid range: $MIN_VALUE - $MAX_VALUE" if (( $? == 0 )); then - if G_CHECK_VALIDINT $G_WHIP_RETURNED_VALUE $MIN_VALUE $MAX_VALUE; then + if G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" $MIN_VALUE $MAX_VALUE; then - sed -i "/CONFIG_CPU_ONDEMAND_SAMPLE_RATE=/c\CONFIG_CPU_ONDEMAND_SAMPLE_RATE=$(( $G_WHIP_RETURNED_VALUE * 1000 ))" /DietPi/dietpi.txt - #Apply changes + G_CONFIG_INJECT 'CONFIG_CPU_ONDEMAND_SAMPLE_RATE=' "CONFIG_CPU_ONDEMAND_SAMPLE_RATE=$(( $G_WHIP_RETURNED_VALUE * 1000 ))" /DietPi/dietpi.txt /DietPi/dietpi/func/dietpi-set_cpu fi fi - unset input_fp - ;; 'CPU Frequency Limits'*) @@ -1714,13 +1744,9 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 readarray available_frequency_array < /tmp/dietpi-available_cpu_freqs local division_factor=1000 #display MHz for user menu # - Intel (disable conversion) - if [[ -f /sys/devices/system/cpu/intel_pstate/max_perf_pct ]]; then - - division_factor=1 + [[ -f /sys/devices/system/cpu/intel_pstate/max_perf_pct ]] && division_factor=1 - fi - - local index=0 #0=max | 1=min + local index=0 # 0=max | 1=min while (( $index < 2 )) do @@ -1844,10 +1870,9 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 G_WHIP_INPUTBOX "When the CPU usage (%) is greater than this value, the CPU frequency will increase from $frequency_min_cpu_governor MHz to $frequency_max_cpu_governor MHz.\n - Valid range $MIN_VALUE - $MAX_VALUE\n - Recommended settings: Desktop = 50%, Server = 85%" if (( $? == 0 )); then - if G_CHECK_VALIDINT $G_WHIP_RETURNED_VALUE $MIN_VALUE $MAX_VALUE; then + if G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" $MIN_VALUE $MAX_VALUE; then G_CONFIG_INJECT 'CONFIG_CPU_USAGE_THROTTLE_UP=' "CONFIG_CPU_USAGE_THROTTLE_UP=$G_WHIP_RETURNED_VALUE" /DietPi/dietpi.txt - #Apply changes /DietPi/dietpi/func/dietpi-set_cpu fi @@ -1864,7 +1889,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 G_WHIP_INPUTBOX "When the ARM temperature ('c) reaches this value, the ARM will underclock to reduce heat. \n - Recommended value is 65 \n - Valid range $MIN_VALUE - $MAX_VALUE" if (( $? == 0 )); then - if G_CHECK_VALIDINT $G_WHIP_RETURNED_VALUE $MIN_VALUE $MAX_VALUE; then + if G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" $MIN_VALUE $MAX_VALUE; then if (( $G_WHIP_RETURNED_VALUE > 65 )); then @@ -1889,7 +1914,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 Change_Hostname(){ - #Get existing Hostname + # Get existing Hostname local hostname_existing=$( /tmp/available_locale + mawk '/UTF-8/ {print $1}' /usr/share/i18n/SUPPORTED | sed 's/#//g' > /tmp/available_locale G_WHIP_MENU_ARRAY=() local index=0 - # convert for whiptail 0-1=1st option 2-3=2nd + # convert for whiptail 0-1=1st option 2-3=2nd while read line do @@ -2154,8 +2170,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 rm /tmp/available_locale G_WHIP_DEFAULT_ITEM=$locale_current - G_WHIP_MENU 'Please select a system locale. DietPi will automatically apply this as the default locale:' - if (( $? == 0 )); then + if G_WHIP_MENU 'Please select a system locale. DietPi will automatically apply this as the default locale:'; then /DietPi/dietpi/func/dietpi-set_software locale "$G_WHIP_RETURNED_VALUE" @@ -2191,7 +2206,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 NET_RX_MB='Unknown' NET_TX_MB='Unknown' - #$1 = device+index + # $1 = device+index Net_Update_UsageStats(){ local input=$1 @@ -2206,14 +2221,14 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 NET_RX_BYTE=$( 0 )); then + if disable_error=1 G_CHECK_VALIDINT "$NET_RX_BYTE" 1; then NET_RX_MB="$(( $NET_RX_BYTE / 1024 / 1024 ))MB" fi NET_TX_MB='Unknown' - if disable_error=1 G_CHECK_VALIDINT $NET_TX_BYTE && (( $NET_TX_BYTE > 0 )); then + if disable_error=1 G_CHECK_VALIDINT "$NET_TX_BYTE" 1; then NET_TX_MB="$(( $NET_TX_BYTE / 1024 / 1024 ))MB" @@ -2293,10 +2308,10 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 Network_Restart(){ - #Stop all services (required for hotspot) + # Stop all services (required for hotspot) /DietPi/dietpi/dietpi-services stop - # Enable/Disable wifi modules + # Enable/Disable WiFi modules if (( $WIFI_DISABLED )); then /DietPi/dietpi/func/dietpi-set_hardware wifimodules disable @@ -2307,34 +2322,34 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Drop Connections + # Drop Connections G_DIETPI-NOTIFY 0 'Dropping connections, please wait...' ifdown eth$ETH_DEV_INDEX --force &> /dev/null ifdown wlan$WIFI_DEV_INDEX --force &> /dev/null - #Kill dhclient + # Kill dhclient killall dhclient &> /dev/null - #Flush, not viable to handle this if change of IP, requires a detect of SSH loss/ip change, then exit script. - # ip addr flush dev eth$ETH_DEV_INDEX &> /dev/null - # ip addr flush dev wlan$WIFI_DEV_INDEX &> /dev/null + # Flush, not viable to handle this if change of IP, requires a detect of SSH loss/ip change, then exit script. + # - ip addr flush dev eth$ETH_DEV_INDEX &> /dev/null + # - ip addr flush dev wlan$WIFI_DEV_INDEX &> /dev/null - #Restart Networking + # Restart Networking G_DIETPI-NOTIFY 2 'Restarting network, please wait...' systemctl daemon-reload - #Manually bring up adapters + # Manually bring up adapters (( $ETH_DISABLED == 0 )) && ifup eth$ETH_DEV_INDEX --force (( $WIFI_DISABLED == 0 )) && ifup wlan$WIFI_DEV_INDEX --force - #Restart all services (required for hotspot) + # Restart all services (required for hotspot) /DietPi/dietpi/dietpi-services start # - Add a little delay to ensure all network device data are updated (eg: SSID current takes a little longer) G_DIETPI-NOTIFY 2 'Reloading networking data, please wait...' sleep 2 - #Update network data + # Update network data Network_GetData G_DIETPI-NOTIFY 0 'Network restarted' @@ -2351,7 +2366,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 Network_ApplyChanges(){ - #Eth + # Eth local eth_enabled_text='' (( $ETH_DISABLED )) && eth_enabled_text='#' @@ -2368,7 +2383,7 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi - #Wlan + # WiFi local wifi_enabled_text='' (( $WIFI_DISABLED )) && wifi_enabled_text='#' @@ -2386,8 +2401,8 @@ More info here: https://www.raspberrypi.org/forums/viewtopic.php?p=105008#p10500 fi cat << _EOF_ > /etc/network/interfaces -#/etc/network/interfaces -#Please use DietPi-Config to modify network settings. +# /etc/network/interfaces +# Please use DietPi-Config to modify network settings. # Local auto lo @@ -2401,7 +2416,7 @@ netmask $ETH_MASK gateway $ETH_GATEWAY ${eth_dns_text}dns-nameservers $ETH_DNS -# Wifi +# WiFi ${wifi_enabled_text}allow-hotplug wlan$WIFI_DEV_INDEX iface wlan$WIFI_DEV_INDEX inet $wifi_dhcp_static_text address $WIFI_IP @@ -2438,24 +2453,24 @@ _EOF_ # - Update WiFi db/wpa_supplicant /DietPi/dietpi/func/dietpi-wifidb 1 - #Update Current Mode for network restart + # Update Current Mode for network restart ETH_MODE=$ETH_MODE_TARGET WIFI_MODE=$WIFI_MODE_TARGET - #restart net + # Restart net Network_Restart } Change_StaticIp(){ - #Ethernet + # Ethernet if (( $1 == 0 )); then G_WHIP_DEFAULT_ITEM=$ETH_IP_STATIC G_WHIP_INPUTBOX 'Please enter a new static IP address' && ETH_IP_STATIC=$G_WHIP_RETURNED_VALUE - #wifi + # WiFi elif (( $1 == 1 )); then G_WHIP_DEFAULT_ITEM=$WIFI_IP_STATIC @@ -2467,13 +2482,13 @@ _EOF_ Change_StaticGateway(){ - #Ethernet + # Ethernet if (( $1 == 0 )); then G_WHIP_DEFAULT_ITEM=$ETH_GATEWAY_STATIC G_WHIP_INPUTBOX 'Please enter a new static Gateway address' && ETH_GATEWAY_STATIC=$G_WHIP_RETURNED_VALUE - #wifi + # WiFi elif (( $1 == 1 )); then G_WHIP_DEFAULT_ITEM=$WIFI_GATEWAY_STATIC @@ -2485,13 +2500,13 @@ _EOF_ Change_StaticMask(){ - #Ethernet + # Ethernet if (( $1 == 0 )); then G_WHIP_DEFAULT_ITEM=$ETH_MASK_STATIC G_WHIP_INPUTBOX 'Please enter a new static Mask address' && ETH_MASK_STATIC=$G_WHIP_RETURNED_VALUE - #wifi + # WiFi elif (( $1 == 1 )); then G_WHIP_DEFAULT_ITEM=$WIFI_MASK_STATIC @@ -2505,7 +2520,7 @@ _EOF_ #$1 = Adapater type | 0=Eth, 1=WiFi - #Store current into var + # Store current into var local current_value=0 # - Ethernet @@ -2522,7 +2537,7 @@ _EOF_ local return_value=$current_value - #Create Menu List for Whiptail + # Create Menu List for Whiptail G_WHIP_MENU_ARRAY=( 'Custom' 'Manually enter your DNS server' @@ -2560,7 +2575,7 @@ _EOF_ fi - #Apply new value + # Apply new value # - Ethernet if (( $1 == 0 )); then @@ -2590,32 +2605,17 @@ _EOF_ ) G_WHIP_DEFAULT_ITEM=$WIFI_COUNTRYCODE - G_WHIP_MENU 'Please select a country, to enable WiFi channels and power ratings allowed in your country.' - if (( $? == 0 )); then - - case "$G_WHIP_RETURNED_VALUE" in - - 'Manual') - - G_WHIP_DEFAULT_ITEM=$WIFI_COUNTRYCODE - G_WHIP_INPUTBOX "Please enter a 2 character country code: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2" - if (( $? == 0 )); then - - wifi_country_code_target=$G_WHIP_RETURNED_VALUE - - fi - - ;; - - *) + if G_WHIP_MENU 'Please select a country, to enable WiFi channels and power ratings allowed in your country.'; then - wifi_country_code_target=$G_WHIP_RETURNED_VALUE + if [[ $G_WHIP_RETURNED_VALUE == 'Manual' ]]; then - ;; + G_WHIP_DEFAULT_ITEM=$WIFI_COUNTRYCODE + G_WHIP_INPUTBOX 'Please enter a 2 character country code: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2' || return + [[ $G_WHIP_RETURNED_VALUE == [[:upper:]][[:upper:]] ]] || { G_WHIP_MSG "[ERROR] Invalid country code ($G_WHIP_RETURNED_VALUE). Aborting..."; return; } - esac + fi + wifi_country_code_target=$G_WHIP_RETURNED_VALUE - #Apply /DietPi/dietpi/func/dietpi-set_hardware wificountrycode "$wifi_country_code_target" # - Restart networking @@ -2626,6 +2626,8 @@ _EOF_ iw reg set $wifi_country_code_target # - Check if country code was successfully applied + # Wait a bid until setting got applied + sleep 0.1 WIFI_COUNTRYCODE=$(iw reg get | mawk '/country/ {print $2;exit}' | tr -d ':') if [[ $WIFI_COUNTRYCODE != $wifi_country_code_target ]]; then @@ -2639,24 +2641,17 @@ _EOF_ Wifi_Reconnect(){ - G_WHIP_YESNO "WiFi will connect to the strongest configured SSID that is secure, with an open SSID being the last priority.\n\nSave all changes and restart networking?\n\nNB: All WiFi connections will be dropped!" - if (( $? == 0 )); then - - #Apply Changes - Network_ApplyChanges - - fi + G_WHIP_YESNO 'WiFi will connect to the strongest configured SSID that is secure, with an open SSID being the last priority.\n\nSave all changes and restart networking?\n\nNB: All WiFi connections will be dropped!' + (( $? == 0 )) && Network_ApplyChanges } Ethernet_Reconnect(){ - G_WHIP_YESNO 'Do you wish to apply settings and reconnect network now? \n\n(NOTICE) All Ethernet connections will be dropped!' - if (( $? == 0 )); then + if G_WHIP_YESNO 'Do you wish to apply settings and reconnect network now? \n\n(NOTICE) All Ethernet connections will be dropped!'; then - #Apply Changes printf '\ec' # clear current terminal screen - echo -e 'Reconnecting Ethernet , please wait' + echo 'Reconnecting Ethernet , please wait...' Network_ApplyChanges fi @@ -2668,13 +2663,13 @@ _EOF_ Network_GetData(){ - #Update DietPi system network details + # Update DietPi system network details /DietPi/dietpi/func/obtain_network_details - #Copy /etc/network/interfaces to /tmp (tmpfs) and pull data from it. + # Copy /etc/network/interfaces to /tmp (tmpfs) and pull data from it. cp /etc/network/interfaces /tmp/net_interfaces - #Reset + # Reset ETH_IP_STATIC=$(mawk '/address / {print $2;exit}' /tmp/net_interfaces) ETH_GATEWAY_STATIC=$(mawk '/gateway / {print $2;exit}' /tmp/net_interfaces) ETH_MASK_STATIC=$(mawk '/netmask / {print $2;exit}' /tmp/net_interfaces) @@ -2714,7 +2709,7 @@ _EOF_ [[ ! $WIFI_SSID_CURRENT ]] && WIFI_SSID_CURRENT='Disconnected / No SSID' WIFI_CRED_INDEX=0 # Which index of SSID/KEY etc we are editing - #Get extra wifi stats + # Get extra WiFi stats WIFI_BITRATE=0 WIFI_SIGNALSTRENGTH=0 # - Hotspot enabled? @@ -2754,20 +2749,20 @@ _EOF_ } - #eth + # Eth if [[ -d /sys/class/net/eth$ETH_DEV_INDEX ]]; then - #Hardware + # Hardware ETH_HARDWARE=1 - #Static or DHCP? + # Static or DHCP? ETH_MODE=$(grep -ci -m1 "iface eth$ETH_DEV_INDEX inet dhcp" /tmp/net_interfaces) ETH_MODE_TARGET=$ETH_MODE - #Connected and Valid IP? + # Connected and Valid IP? ETH_CONNECTED=$(ip -o r l dev eth$ETH_DEV_INDEX | grep -vcim1 '[[:blank:]]linkdown') - #Enabled and Connected + # Enabled and Connected if (( $ETH_DISABLED == 0 && $ETH_CONNECTED == 1 )); then ETH_IP=$(ip a s eth$ETH_DEV_INDEX | grep -m1 '^[[:blank:]]*inet ' | mawk '{print $2}' | sed 's|/.*$||') @@ -2779,19 +2774,20 @@ _EOF_ fi + # WiFi if [[ -d /sys/class/net/wlan$WIFI_DEV_INDEX ]]; then - #Hardware + # Hardware WIFI_HARDWARE=1 - #Static or DHCP? + # Static or DHCP? WIFI_MODE=$(grep -ci -m1 "iface wlan$WIFI_DEV_INDEX inet dhcp" /tmp/net_interfaces) WIFI_MODE_TARGET=$WIFI_MODE - #Connected and Valid IP? + # Connected and Valid IP? WIFI_CONNECTED=$(ip -o r l dev wlan$ETH_DEV_INDEX | grep -vcim1 '[[:blank:]]linkdown') - #Enabled and Connected + # Enabled and Connected if (( $WIFI_DISABLED == 0 && $WIFI_CONNECTED == 1 )); then WIFI_IP=$(ip a s wlan$WIFI_DEV_INDEX | grep -m1 '^[[:blank:]]*inet ' | mawk '{print $2}' | sed 's|/.*$||') @@ -2799,7 +2795,7 @@ _EOF_ WIFI_MASK=$(cidr2mask $(ip a s wlan$WIFI_DEV_INDEX | grep -m1 '^[[:blank:]]*inet ' | mawk '{print $2}' | sed 's|^.*/||')) WIFI_DNS=$(mawk '/nameserver/ {print $2;exit}' /etc/resolv.conf) - #Get extra wifi stats + # Get extra WiFi stats WIFI_BITRATE=$(iwconfig wlan$WIFI_DEV_INDEX | mawk '/Bit Rate/ {print $2;exit}' | sed 's/Rate[:=]//g') WIFI_SIGNALSTRENGTH=$(iwconfig wlan$WIFI_DEV_INDEX | mawk '/Signal level=/ {print $4;exit}' | sed 's/level=//g' | cut -f1 -d "/") @@ -2818,78 +2814,70 @@ _EOF_ fi - #cleanup tmp + # Cleanup tmp [[ -f /tmp/net_interfaces ]] && rm /tmp/net_interfaces } - #TARGETMENUID=8 + # TARGETMENUID=8 Menu_NetworkAdapters(){ - TARGETMENUID=0 - - #Check Network + # Check Network Network_GetData - G_WHIP_MENU_ARRAY=() - - #Obtain enabled/disabled status + # Obtain enabled/disabled status local eth_disabled_text='[On]' (( $ETH_DISABLED )) && eth_disabled_text='[Off]' local wlan_disabled_text='[On]' (( $WIFI_DISABLED )) && wlan_disabled_text='[Off]' - #Obtain Hardware Status + # Obtain Hardware Status local eth_hardware_text='Available' - (( ! $ETH_HARDWARE )) && eth_hardware_text='Not Found' + (( $ETH_HARDWARE )) || eth_hardware_text='Not Found' local wlan_hardware_text='Available' - (( ! $WIFI_HARDWARE )) && wlan_hardware_text='Not Found' + (( $WIFI_HARDWARE )) || wlan_hardware_text='Not Found' - #Obtain Connected/Carrier Status + # Obtain Connected/Carrier Status local eth_connected_text='Disconnected' (( $ETH_CONNECTED )) && eth_connected_text='Connected' local wlan_connected_text='Disconnected' if (( $WIFI_CONNECTED )); then - wlan_connected_text='Connected' - (( $WIFI_HOTSPOT )) && wlan_connected_text='WiFi Hotspot Mode' + (( $WIFI_HOTSPOT )) && wlan_connected_text='WiFi Hotspot Mode' || wlan_connected_text='Connected' fi - #Internet Connection Status - local Internet_connected_text='Please run Internet Test' + # Internet Connection Status + local Internet_connected_text='Run internet connection test' if (( $INTERNET_TEST_STATE == 2 )); then - Internet_connected_text='[On]' + Internet_connected_text='[Success] | Online' elif (( $INTERNET_TEST_STATE == 1 )); then - Internet_connected_text='[Fail] | Offline' + Internet_connected_text='[Failure] | Offine' fi - #Proxy settings (global vars, force an int to obtain current values stored in dietpi.txt) + # Proxy settings: Scrapes $http_proxy, otherwise obtains current values stored in dietpi.txt Load_Proxy_Vars local proxy_state_text='[Off]' (( $PROXY_ENABLED )) && proxy_state_text="[On] | $PROXY_ADDRESS:$PROXY_PORT" - # - Reset init flag. Ensures Menu_Proxy() reloads current settings. - PROXY_ENABLED=-1 - - G_WHIP_MENU_ARRAY+=('' '●─ Adapter Options ') - G_WHIP_MENU_ARRAY+=('Ethernet' ': Change Wired Network Settings') - G_WHIP_MENU_ARRAY+=('WiFi' ': Change Wireless Network Settings') + G_WHIP_MENU_ARRAY=('' '●─ Adapter Options ') + G_WHIP_MENU_ARRAY+=('Ethernet' ": $eth_hardware_text | $eth_disabled_text | $eth_connected_text") + G_WHIP_MENU_ARRAY+=('WiFi' ": $wlan_hardware_text | $wlan_disabled_text | $wlan_connected_text") # - Onboard WiFi - local onboard_wifi_enabled=1 - # RPi 3/ZeroW + # RPi 3/Zero W if (( $HW_ONBOARD_WIFI )); then - if [[ -f /etc/modprobe.d/disable_wifi_rpi3_onboard.conf ]]; then + local onboard_wifi_enabled=1 + if [[ -f '/etc/modprobe.d/disable_wifi_rpi3_onboard.conf' ]]; then onboard_wifi_enabled=0 G_WHIP_MENU_ARRAY+=('Onboard WiFi' ': [Off]') @@ -2904,9 +2892,9 @@ _EOF_ G_WHIP_MENU_ARRAY+=('' '●─ Additional Options ') - #IPv6 + # IPv6 local ipv6_status_text='[WARNING] Not supported or disabled on kernel level!' - if [[ -d /proc/sys/net/ipv6 ]]; then + if [[ -d '/proc/sys/net/ipv6' ]]; then local ipv6_enabled=0 ipv6_status_text='[Off]' @@ -2922,12 +2910,10 @@ _EOF_ local ipv4_preferred=0 local ipv4_status_text='[Off]' - local ipv4_status_long='\nIPv4 : Not preferred over IPv6 with APT and wget' if [[ -f /etc/apt/apt.conf.d/99-dietpi-force-ipv4 ]]; then ipv4_preferred=1 ipv4_status_text='[On]' - ipv4_status_long='\nIPv4 : Preferred over IPv6 with APT and wget' fi G_WHIP_MENU_ARRAY+=('Prefer IPv4' ": $ipv4_status_text") @@ -2936,14 +2922,10 @@ _EOF_ fi - G_WHIP_MENU_ARRAY+=('Test' ': Run the internet connection test') - G_WHIP_MENU_ARRAY+=('Proxy' ': Configure proxy settings') + G_WHIP_MENU_ARRAY+=('Proxy' ": $proxy_state_text") + G_WHIP_MENU_ARRAY+=('Test' ": $Internet_connected_text") - G_WHIP_MENU "Ethernet : $eth_hardware_text | $eth_disabled_text | $eth_connected_text \nWifi : $wlan_hardware_text | $wlan_disabled_text | $wlan_connected_text\nIPv6 : $ipv6_status_text$ipv4_status_long\nInternet : $Internet_connected_text\nProxy : $proxy_state_text" - if (( $? == 0 )); then - - #Return to this Menu - TARGETMENUID=8 + if G_WHIP_MENU 'Please select an option to change:'; then case "$G_WHIP_RETURNED_VALUE" in @@ -2959,20 +2941,16 @@ _EOF_ fi - REBOOT_REQUIRED=1 - G_WHIP_MSG 'Onboard WiFi modules setting applied\n\nNB: A reboot is required for the changes to take effect.' ;; 'IPv6') - #Disable if (( $ipv6_enabled )); then /DietPi/dietpi/func/dietpi-set_hardware enableipv6 0 - #Enable else /DietPi/dietpi/func/dietpi-set_hardware enableipv6 1 @@ -2983,12 +2961,10 @@ _EOF_ 'Prefer IPv4') - #Don't prefer if (( $ipv4_preferred )); then /DietPi/dietpi/func/dietpi-set_hardware preferipv4 0 - #Prefer else /DietPi/dietpi/func/dietpi-set_hardware preferipv4 1 @@ -2999,16 +2975,16 @@ _EOF_ 'Ethernet') - #No hardware found + # No hardware found if (( ! $ETH_HARDWARE )); then - G_WHIP_MSG 'No Ethernet Hardware was found. You are most likely running a Pi Model A.' + G_WHIP_MSG 'No Ethernet hardware was detected on your device.' - #Disabled + # Disabled elif (( $ETH_DISABLED )); then - G_WHIP_YESNO 'Ethernet must be enabled before settings can be changed.\n\nWould you like to enable Ethernet now?\n - (NOTICE) Connections may drop!' - if (( $? == 0 )); then + if G_WHIP_YESNO 'Ethernet must be enabled before settings can be changed.\n +Would you like to enable Ethernet now?\n - (NOTICE) Connections may drop!'; then ETH_DISABLED=0 Network_ApplyChanges @@ -3026,22 +3002,22 @@ _EOF_ 'WiFi') - #Disabled | Offer chance to enable (also enables wifi modules) + # Disabled | Offer chance to enable (also enables WiFi modules) if (( $WIFI_DISABLED )); then - G_WHIP_YESNO 'WiFi must be enabled before settings can be changed.\n\nWould you like to enable WiFi now? \n - (NOTICE) Connections may drop!' - if (( $? == 0 )); then + if G_WHIP_YESNO 'WiFi must be enabled before settings can be changed.\n +Would you like to enable WiFi now? \n - (NOTICE) Connections may drop!'; then WIFI_DISABLED=0 Network_ApplyChanges fi - # - No hardware found + # No hardware found elif (( ! $WIFI_HARDWARE )); then - G_WHIP_YESNO 'No supported Wifi Hardware was found.\n\nWould you like to disable WiFi? \n - (NOTICE) Connections may drop!' - if (( $? == 0 )); then + if G_WHIP_YESNO 'No supported WiFi hardware was found.\n +Would you like to disable WiFi? \n - (NOTICE) Connections may drop!'; then WIFI_DISABLED=1 Network_ApplyChanges @@ -3059,20 +3035,19 @@ _EOF_ 'Test') G_WHIP_DEFAULT_ITEM=$INTERNET_TEST_URL - G_WHIP_INPUTBOX 'Press enter a URL address to test (eg: http://google.com)' - if (( $? == 0 )); then + if G_WHIP_INPUTBOX 'Please enter a URL address to test (eg: https://dietpi.com)'; then INTERNET_TEST_URL=$G_WHIP_RETURNED_VALUE - INTERNET_TEST_STATE=0 #Not tested - G_ERROR_HANDLER_INFO_ONLY=1 retry_max=2 G_CHECK_URL "$INTERNET_TEST_URL" + INTERNET_TEST_STATE=0 # Not tested + G_ERROR_HANDLER_INFO_ONLY=1 G_CHECK_URL "$INTERNET_TEST_URL" if (( $G_ERROR_HANDLER_EXITCODE_RETURN == 0 )); then - INTERNET_TEST_STATE=2 #Online + INTERNET_TEST_STATE=2 # Online else - INTERNET_TEST_STATE=1 #Failed + INTERNET_TEST_STATE=1 # Failed fi @@ -3088,14 +3063,15 @@ _EOF_ esac - #Cancel + # Cancel else - #Exit DietPi-Config on back to previous menu? + TARGETMENUID=0 # Return to main menu + + # Exit DietPi-Config on back to previous menu? if (( $EXITONBACK == 1 )); then - #Return to this menu - TARGETMENUID=8 + TARGETMENUID=8 # Return to this menu Menu_Exit fi @@ -3104,7 +3080,7 @@ _EOF_ } - #TARGETMENUID=9 + # TARGETMENUID=9 Menu_NetworkAdapters_Ethernet(){ TARGETMENUID=8 @@ -3143,8 +3119,7 @@ _EOF_ G_WHIP_MENU "Ethernet Details:\nUsage : Sent = $NET_TX_MB | Recieved = $NET_RX_MB\nAddress : IP = $ETH_IP | Mask = $ETH_MASK | Gateway = $ETH_GATEWAY | DNS = $ETH_DNS" if (( $? == 0 )); then - #Return to this menu - TARGETMENUID=9 + TARGETMENUID=9 # Return to this menu WHIP_SELECTION_PREVIOUS=$G_WHIP_RETURNED_VALUE @@ -3230,7 +3205,7 @@ _EOF_ } - #TARGETMENUID=10 + # TARGETMENUID=10 Menu_NetworkAdapters_Wifi(){ TARGETMENUID=8 @@ -3242,7 +3217,7 @@ _EOF_ G_WHIP_MENU_ARRAY=('' '●─ Basic Options ') - #WiFi Hotspot Menu + # WiFi Hotspot Menu if (( $WIFI_HOTSPOT )); then # - Load current details into global vars, once. @@ -3254,7 +3229,7 @@ _EOF_ fi - # N enabled? + # - N enabled? local hotspot_n_enabled=0 local hotspot_n_text='Disabled' if grep -q '^ieee80211n=1' /etc/hostapd/hostapd.conf; then @@ -3264,18 +3239,14 @@ _EOF_ fi - # toggle + # - Toggle local hotspot_active_state=$(systemctl is-active hostapd | grep -ci -m1 '^active' ) - local hotspot_status_text='Status : ' - local hotspot_active_state_text='[Enabled] | Select to turn off hotspot' - if (( ! $hotspot_active_state )); then + local hotspot_status_text='Status : Offline' + local hotspot_active_state_text='[Disabled] | Select to turn on hotspot' + if (( $hotspot_active_state )); then - hotspot_active_state_text='[Disabled] | Select to turn on hotspot' - hotspot_status_text+='Offline' - - else - - hotspot_status_text+='Online' + hotspot_status_text+='Status : Online' + hotspot_active_state_text='[Enabled] | Select to turn off hotspot' fi @@ -3286,16 +3257,16 @@ _EOF_ description_text+=$hotspot_status_text - #WiFi Menu + # WiFi Menu else # - Get current Mode details local mode_current='DHCP' - (( $WIFI_MODE == 0 )) && mode_current='STATIC' + (( $WIFI_MODE )) || mode_current='STATIC' # - Target Details local mode_target='DHCP' - (( $WIFI_MODE_TARGET == 0 )) && mode_target='STATIC' + (( $WIFI_MODE_TARGET )) || mode_target='STATIC' G_WHIP_MENU_ARRAY+=('Scan' ': Scan and configure SSID') @@ -3361,8 +3332,7 @@ _EOF_ G_WHIP_DEFAULT_ITEM=$WHIP_SELECTION_PREVIOUS if G_WHIP_MENU "$description_text"; then - #Return to this menu - TARGETMENUID=10 + TARGETMENUID=10 # Return to this menu WHIP_SELECTION_PREVIOUS=$G_WHIP_RETURNED_VALUE @@ -3545,7 +3515,7 @@ _EOF_ } - #TARGETMENUID=11 + # TARGETMENUID=11 Menu_Tools(){ TARGETMENUID=0 @@ -3579,7 +3549,7 @@ _EOF_ } - #TARGETMENUID=12 + # TARGETMENUID=12 Menu_FilesystemBenchmark(){ TARGETMENUID=11 @@ -3614,8 +3584,7 @@ Additional benchmarks: - Network LAN : Transfer rate = $BENCH_NET_LAN_SPEED MB/s" if (( $? == 0 )); then - #Return to this menu - TARGETMENUID=12 + TARGETMENUID=12 # Return to this menu case "$G_WHIP_RETURNED_VALUE" in @@ -3702,7 +3671,7 @@ Additional benchmarks: sed -i '/core_freq=/c\#core_freq=250' /DietPi/config.txt sed -i '/sdram_freq=/c\#sdram_freq=400' /DietPi/config.txt - #Zero , via name id + # Zero , via name id if grep -qi 'rpi zero' /DietPi/dietpi/.hw_model; then sed -i '/arm_freq=/c\#arm_freq=1000' /DietPi/config.txt @@ -3723,32 +3692,27 @@ Additional benchmarks: } - #TARGETMENUID=13 + # TARGETMENUID=13 Menu_Overclock(){ TARGETMENUID=4 - #Get Current Overclocking Settings + # Get Current Overclocking Settings local over_voltage_value=$(grep -m1 'over_voltage=' /DietPi/config.txt | tr -d '#over_voltage=') local arm_freq_value=$(grep -m1 'arm_freq=' /DietPi/config.txt | tr -d '#arm_freq=') local core_freq_value=$(grep -m1 'core_freq=' /DietPi/config.txt | tr -d '#core_freq=') local sdram_freq_value=$(grep -m1 'sdram_freq=' /DietPi/config.txt | tr -d '#sdram_freq=') - #Overclocking Pi1 + # Overclocking RPi1 # - Zero if grep -qi 'rpi zero' /DietPi/dietpi/.hw_model; then - G_WHIP_MENU_ARRAY=( - - 'none' ': 1000 MHz ARM | 400 MHz core | 450 MHz SDRAM | 0 overvolt' - - ) + G_WHIP_MENU_ARRAY=('none' ': 1000 MHz ARM | 400 MHz core | 450 MHz SDRAM | 0 overvolt') G_WHIP_MENU "Hardware : $G_HW_MODEL_DESCRIPTION\nCurrent: $arm_freq_value MHz ARM | $core_freq_value MHz core | $sdram_freq_value MHz SDRAM | $over_voltage_value overvolt" if (( $? == 0 )); then - #Return to this menu - TARGETMENUID=13 + TARGETMENUID=13 # Return to this menu case "$G_WHIP_RETURNED_VALUE" in @@ -3776,8 +3740,7 @@ Additional benchmarks: G_WHIP_MENU "Hardware : $G_HW_MODEL_DESCRIPTION\nCurrent: $arm_freq_value MHz ARM | $core_freq_value MHz core | $sdram_freq_value MHz SDRAM | $over_voltage_value overvolt" if (( $? == 0 )); then - #Return to this menu - TARGETMENUID=13 + TARGETMENUID=13 # Return to this menu case "$G_WHIP_RETURNED_VALUE" in 'none') @@ -3824,7 +3787,7 @@ Additional benchmarks: fi - #Overclocking Pi2 + # Overclocking Pi2 elif (( $G_HW_MODEL == 2 )); then G_WHIP_MENU_ARRAY=( @@ -3839,8 +3802,7 @@ Additional benchmarks: G_WHIP_MENU "Hardware : $G_HW_MODEL_DESCRIPTION\nCurrent: $arm_freq_value MHz ARM | $core_freq_value MHz core | $sdram_freq_value MHz SDRAM | $over_voltage_value overvolt" if (( $? == 0 )); then - #Return to this menu - TARGETMENUID=13 + TARGETMENUID=13 # Return to this menu case "$G_WHIP_RETURNED_VALUE" in @@ -3892,16 +3854,12 @@ Additional benchmarks: fi - #Overclocking Pi3 + # Overclocking Pi3 elif (( $G_HW_MODEL == 3 )); then if grep -qi 'RPi 3 Model B+' /DietPi/dietpi/.hw_model; then - G_WHIP_MENU_ARRAY=( - - 'none' ': 1400 MHz ARM | 400 MHz core | 500 MHz SDRAM | 0 overvolt' - - ) + G_WHIP_MENU_ARRAY=('none' ': 1400 MHz ARM | 400 MHz core | 500 MHz SDRAM | 0 overvolt') else @@ -3919,8 +3877,7 @@ Additional benchmarks: G_WHIP_MENU "Hardware : $G_HW_MODEL_DESCRIPTION \nCurrent: $arm_freq_value MHz ARM | $core_freq_value MHz core | $sdram_freq_value MHz SDRAM | $over_voltage_value overvolt" if (( $? == 0 )); then - #Return to this menu - TARGETMENUID=13 + TARGETMENUID=13 # Return to this menu case "$G_WHIP_RETURNED_VALUE" in @@ -3977,7 +3934,7 @@ Additional benchmarks: } - #TARGETMENUID=14 + # TARGETMENUID=14 Menu_AudioOptions(){ TARGETMENUID=0 @@ -4017,8 +3974,7 @@ Additional benchmarks: if G_WHIP_MENU 'Please select an option:'; then - #Return to This Menu - TARGETMENUID=14 + TARGETMENUID=14 # Return to this menu if [[ $G_WHIP_RETURNED_VALUE == 'PSU noise reduction' ]]; then @@ -4047,7 +4003,7 @@ Additional benchmarks: G_WHIP_MENU_ARRAY=() # - Global: - # RPI, none disables HDMI aswell. + # RPi, none disables HDMI as well. if (( $G_HW_MODEL < 10 )); then G_WHIP_MENU_ARRAY+=('none' ': Disables HDMI + 3.5mm Analogue') @@ -4058,18 +4014,15 @@ Additional benchmarks: G_WHIP_MENU_ARRAY+=('default' ': 3.5mm Analogue') # Native PC/MISC devices | Detect and list available - elif (( $G_HW_MODEL == 21 || + elif (( $G_HW_MODEL == 15 || + $G_HW_MODEL == 21 || $G_HW_MODEL == 40 || $G_HW_MODEL == 42 || $G_HW_MODEL == 43 || $G_HW_MODEL == 44 || $G_HW_MODEL == 67 )); then G_WHIP_MENU_ARRAY+=('default' ': HW:0,0') # Install prereqs to allow for detection - if dpkg-query -s alsa-utils &> /dev/null; then - - /DietPi/dietpi/func/dietpi-set_hardware soundcard default - - fi + dpkg-query -s alsa-utils &> /dev/null || /DietPi/dietpi/func/dietpi-set_hardware soundcard default for i in {0..9} do @@ -4155,9 +4108,9 @@ Additional benchmarks: G_WHIP_MENU_ARRAY+=('H3-analogue' ': 3.5mm analogue') # - H5 - # elif (( $G_HW_CPUID == 2 )); then + #elif (( $G_HW_CPUID == 2 )); then - # G_WHIP_MENU_ARRAY+=('H5-analogue' '3.5mm analogue') + #G_WHIP_MENU_ARRAY+=('H5-analogue' '3.5mm analogue') # - Sparky elif (( $G_HW_MODEL == 70 )); then @@ -4196,8 +4149,8 @@ Additional benchmarks: } - #TARGETMENUID=15 - STRESS_TEST_MODE=0 #0=CPU only | 1=CPU/RAM 2=CPU/RAM/IO + # TARGETMENUID=15 + STRESS_TEST_MODE=0 # 0=CPU only | 1=CPU/RAM 2=CPU/RAM/IO STRESS_TEST_DURATION=60 STRESS_TEST_RESULTS_TEMP_MIN=0 STRESS_TEST_RESULTS_TEMP_MAX=0 @@ -4227,8 +4180,7 @@ Additional benchmarks: if G_WHIP_MENU 'Please select an option:'; then - #Return to this menu - TARGETMENUID=15 + TARGETMENUID=15 # Return to this menu if [[ $G_WHIP_RETURNED_VALUE == 'Duration' ]]; then @@ -4243,11 +4195,7 @@ Additional benchmarks: ) G_WHIP_DEFAULT_ITEM=$STRESS_TEST_DURATION - if G_WHIP_MENU 'Please select a duration for the test'; then - - STRESS_TEST_DURATION=$G_WHIP_RETURNED_VALUE - - fi + G_WHIP_MENU 'Please select a duration for the test' && STRESS_TEST_DURATION=$G_WHIP_RETURNED_VALUE elif [[ $G_WHIP_RETURNED_VALUE == 'Mode' ]]; then @@ -4260,11 +4208,7 @@ Additional benchmarks: ) G_WHIP_DEFAULT_ITEM=$STRESS_TEST_MODE - if G_WHIP_MENU 'Please select a stress test type'; then - - STRESS_TEST_MODE=$G_WHIP_RETURNED_VALUE - - fi + G_WHIP_MENU 'Please select a stress test type' && STRESS_TEST_MODE=$G_WHIP_RETURNED_VALUE elif [[ $G_WHIP_RETURNED_VALUE == 'Start' ]]; then @@ -4276,7 +4220,7 @@ Additional benchmarks: local start_time=$(date) local start_time_epoch=$(date +%s) local memory_per_thread=$(( $(free -m | mawk '/^Mem:/ {print $2;exit}') / ( $G_HW_CPU_CORES * 2 ) )) - local fp_log="$HOME/dietpi-config_stress.log" + local fp_log='/root/dietpi-config_stress.log' rm $fp_log &> /dev/null if (( $STRESS_TEST_MODE == 0 )); then @@ -4356,15 +4300,15 @@ Additional benchmarks: } - #TARGETMENUID=16 + # TARGETMENUID=16 Menu_Network_Nas_Misc(){ TARGETMENUID=0 - #Update installed software + # Update installed software Load_Installed_Software - #No-IP Client + # No-IP Client local noip_installed=0 local noip_status='Not Installed' local noip_menutext='Install No-IP now' @@ -4374,7 +4318,7 @@ Additional benchmarks: noip_status='Offline - Please enter No-IP details' noip_menutext='Enter/Setup No-IP details' - #Check if No-IP is running (indicates login details are valid) + # Check if No-IP is running (indicates login details are valid) if pgrep '/usr/local/bin/noip2' &> /dev/null; then noip_status='Online / Active' @@ -4384,15 +4328,15 @@ Additional benchmarks: fi - #APT mirror + # APT mirror local apt_mirror_current=$(grep -m1 '^[[:blank:]]*deb[[:blank:]]' /etc/apt/sources.list | mawk '{print $2}') [[ $apt_mirror_current ]] || apt_mirror_current='Unknown, no string from scrape' - #NTP mirror + # NTP mirror local ntp_mirror_current=$(grep -m1 '^[[:blank:]]*CONFIG_NTP_MIRROR=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') [[ $ntp_mirror_current ]] || ntp_mirror_current='Unknown, no string from scrape' - #Network boot wait + # Network boot wait local boot_wait_for_network=$(grep -m1 '^[[:blank:]]*CONFIG_BOOT_WAIT_FOR_NETWORK=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') local boot_wait_for_network_text='' if (( $boot_wait_for_network == 0 )); then @@ -4409,13 +4353,19 @@ Additional benchmarks: fi + local check_url_timeout=$(grep -m1 '^[[:blank:]]*CONFIG_G_CHECK_URL_TIMEOUT=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + local check_url_attempts=$(grep -m1 '^[[:blank:]]*CONFIG_G_CHECK_URL_ATTEMPTS=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + G_WHIP_MENU_ARRAY=( '' '●─ Mirror Options ' 'APT Mirror' ": [$apt_mirror_current]" 'NTP Mirror' ": [$ntp_mirror_current]" - '' '●─ Additional Options ' + '' '●─ Connection Test Options ' 'Boot Net Wait' ": [$boot_wait_for_network_text]" + 'G_CHECK_URL Timeout' ": [$check_url_timeout Seconds]" + 'G_CHECK_URL Attempts' ": [$check_url_attempts Tries]" + '' '●─ Additional Options ' 'Network Drives' ': Mount/control networked storage' 'No-IP' ": [$noip_menutext]" @@ -4423,11 +4373,36 @@ Additional benchmarks: if G_WHIP_MENU ''; then - #Return to this Menu - TARGETMENUID=16 + TARGETMENUID=16 # Return to this menu case "$G_WHIP_RETURNED_VALUE" in + 'G_CHECK_URL Timeout') + + local min=5 max=60 + G_WHIP_DEFAULT_ITEM=$check_url_timeout + G_WHIP_INPUTBOX "This setting tells DietPi how long to wait, before G_CHECK_URL assumes a dead connection attempt (and failure).\nIncrease this value if you have a 'flaky' connection.\n\nPlease enter a value between $min and $max." + if (( $? == 0 )) && G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" $min $max; then + + G_CONFIG_INJECT 'CONFIG_G_CHECK_URL_TIMEOUT=' "CONFIG_G_CHECK_URL_TIMEOUT=$G_WHIP_RETURNED_VALUE" /DietPi/dietpi.txt + + fi + + ;; + + 'G_CHECK_URL Attempts') + + local min=2 max=10 + G_WHIP_DEFAULT_ITEM=$check_url_attempts + G_WHIP_INPUTBOX "This setting tells DietPi how many times to check a URL, before G_CHECK_URL assumes a dead URL link (and failure).\nIncrease this value if you have a 'flaky' connection.\n\nPlease enter a value between $min and $max." + if (( $? == 0 )) && G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" $min $max; then + + G_CONFIG_INJECT 'CONFIG_G_CHECK_URL_ATTEMPTS=' "CONFIG_G_CHECK_URL_ATTEMPTS=$G_WHIP_RETURNED_VALUE" /DietPi/dietpi.txt + + fi + + ;; + 'Network Drives') G_WHIP_YESNO 'The ability to mount and control networked drives has moved to:\n - DietPi-Drive_manager\n\nWould you like to launch the program now?' @@ -4453,12 +4428,19 @@ Additional benchmarks: 'APT Mirror') - #Create Menu List for Whiptail - G_WHIP_MENU_ARRAY=( + # Jessie ARMv8: https://github.com/MichaIng/DietPi/issues/2665#issuecomment-477348864 + if (( $G_HW_ARCH == 3 && $G_DISTRO < 4 )); then - 'Custom' ': Manually enter APT mirror' + G_WHIP_MSG '[INFO] Debian has dropped the Jessie ARMv8 branch from the official APT repository.\n +Related packages are now available only from the archive: http://archive.debian.org/debian/\n +This has been applied to your APT sources.list during DietPi update to v6.23 and it cannot be changed.\n +Aborting...' + return - ) + fi + + # Create Menu List for Whiptail + G_WHIP_MENU_ARRAY=('Custom' ': Manually enter APT mirror') # - Raspbian if (( $G_HW_MODEL < 10 )); then @@ -4510,7 +4492,7 @@ Additional benchmarks: 'NTP Mirror') - #Create Menu List for Whiptail + # Create Menu List for Whiptail G_WHIP_MENU_ARRAY=( 'Gateway' ': Use local router as NTP server (Recommended)' @@ -4584,7 +4566,7 @@ NB: If you need to use *.pool.ntp.org servers, enter the base domain only. The s 'No-IP') - #Installed? + # Installed? if (( ! $noip_installed )); then G_WHIP_YESNO 'No-IP Client is not installed, would you like to install it now?\n @@ -4595,7 +4577,7 @@ NB: If you need to use *.pool.ntp.org servers, enter the base domain only. The s printf '\ec' # clear current terminal screen G_RUN_CMD systemctl stop noip2 - #Failsafe: Directory required for "noip2 -C" to create the config file there + # Failsafe: Directory required for "noip2 -C" to create the config file there mkdir -p /usr/local/etc noip2 -C read -p 'Press any key to continue...' @@ -4607,14 +4589,13 @@ NB: If you need to use *.pool.ntp.org servers, enter the base domain only. The s esac - #Cancel + # Cancel else - #Exit DietPi-Config on back to previous menu? + # Exit DietPi-Config on back to previous menu? if (( $EXITONBACK == 1 )); then - #Return to this menu - TARGETMENUID=16 + TARGETMENUID=16 # Return to this menu Menu_Exit fi @@ -4623,147 +4604,142 @@ NB: If you need to use *.pool.ntp.org servers, enter the base domain only. The s } - PROXY_ENABLED=-1 + PROXY_ENABLED=0 PROXY_ADDRESS='' PROXY_PORT='' PROXY_USERNAME='' PROXY_PASSWORD='' - #So we can call this in other menus (eg: submenu of this) + # So we can call this in other menus (eg: submenu of this) Load_Proxy_Vars(){ - PROXY_ENABLED=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_ENABLED=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') - PROXY_ADDRESS=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_ADDRESS=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') - PROXY_PORT=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_PORT=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') - PROXY_USERNAME=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_USERNAME=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') - PROXY_PASSWORD=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_PASSWORD=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + if [[ -f '/etc/bashrc.d/dietpi-proxy.sh' ]]; then - } + PROXY_ENABLED=1 + . /etc/bashrc.d/dietpi-proxy.sh - #TARGETMENUID=17 - Menu_NetworkAdapters_Proxy(){ + else - TARGETMENUID=8 + PROXY_ENABLED=0 + # Inform user if DietPi proxy state does not match variable existence + # - This occurs either because of missing reboot/login after exiting script before, or, proxy was set up outside of DietPi scripts + # - Prompt only when inside/entering proxy settings + [[ $http_proxy && $TARGETMENUID == 17 ]] && G_WHIP_MSG 'Either a proxy was set up outside of DietPi scripts or you need to reload you current login session (logout+login or reboot) for changes to take effect.' - #Get current details on first menu init (PROXY_ENABLED=-1) - if (( $PROXY_ENABLED == -1 )); then + fi + + if [[ $http_proxy ]]; then - Load_Proxy_Vars + PROXY_ADDRESS=${http_proxy#*//}; PROXY_ADDRESS=${PROXY_ADDRESS%:*} + PROXY_PORT=${http_proxy##*:} + if [[ $http_proxy == *@* ]]; then - proxy_state_text='[Off]' - (( $PROXY_ENABLED )) && proxy_state_text='[On]' + PROXY_ADDRESS=${PROXY_ADDRESS#*@} + PROXY_USERNAME=${http_proxy#*//}; PROXY_USERNAME=${PROXY_USERNAME%%:*} + PROXY_PASSWORD=${http_proxy%%@*}; PROXY_PASSWORD=${PROXY_PASSWORD##*:} + + fi + + else + + [[ $PROXY_ADDRESS ]] || PROXY_ADDRESS=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_ADDRESS=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + [[ $PROXY_PORT ]] || PROXY_PORT=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_PORT=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + [[ $PROXY_USERNAME ]] || PROXY_USERNAME=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_USERNAME=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + [[ $PROXY_PASSWORD ]] || PROXY_PASSWORD=$(grep -m1 '^[[:blank:]]*CONFIG_PROXY_PASSWORD=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') fi - proxy_state_text_new='No' - (( $PROXY_ENABLED )) && proxy_state_text_new='Yes' + } + + # TARGETMENUID=17 + Menu_NetworkAdapters_Proxy(){ + + Load_Proxy_Vars + + local proxy_state_text='[Off]' + (( $PROXY_ENABLED )) && proxy_state_text='[On]' G_WHIP_MENU_ARRAY=( - 'Toggle' ": Use Proxy?: $proxy_state_text_new" - 'Address' ': Enter Proxy server IP/URL' - 'Port' ': Enter Proxy server port' - 'Username' ': Enter Proxy server username' - 'Password' ': Enter Proxy server password' - 'Apply' ': Save Changes' + 'State' ": $proxy_state_text" + 'Address' ": $PROXY_ADDRESS" + 'Port' ": $PROXY_PORT" + 'Username' ": $PROXY_USERNAME" + 'Password' ": $PROXY_PASSWORD" ) - G_WHIP_MENU "Current Details:\n - Status: $proxy_state_text\n - Address: $PROXY_ADDRESS\n - Port: $PROXY_PORT\n - Username: $PROXY_USERNAME\n - Password: $PROXY_PASSWORD" - if (( $? == 0 )); then - - #Return to this menu - TARGETMENUID=17 + if G_WHIP_MENU 'Please select an option to change:'; then case "$G_WHIP_RETURNED_VALUE" in - 'Toggle') + 'State') - ((PROXY_ENABLED++)) - (( $PROXY_ENABLED > 1 )) && PROXY_ENABLED=0 + (( $PROXY_ENABLED )) && PROXY_ENABLED=0 || PROXY_ENABLED=1 ;; 'Address') G_WHIP_DEFAULT_ITEM=$PROXY_ADDRESS - G_WHIP_INPUTBOX 'Please enter the proxy URL or IP address\n - eg: MyProxy.com' - (( $? == 0 )) && PROXY_ADDRESS=$G_WHIP_RETURNED_VALUE + G_WHIP_INPUTBOX 'Please enter the proxy URL or IP address\n - eg: MyProxy.com' && PROXY_ADDRESS=$G_WHIP_RETURNED_VALUE + G_CONFIG_INJECT 'CONFIG_PROXY_ADDRESS=' "CONFIG_PROXY_ADDRESS=$PROXY_ADDRESS" /DietPi/dietpi.txt ;; 'Port') G_WHIP_DEFAULT_ITEM=$PROXY_PORT - G_WHIP_INPUTBOX 'Please enter the proxy port number\n - eg: 1234' - (( $? == 0 )) && PROXY_PORT=$G_WHIP_RETURNED_VALUE + G_WHIP_INPUTBOX 'Please enter the proxy port number\n - eg: 1234' && PROXY_PORT=$G_WHIP_RETURNED_VALUE + G_CONFIG_INJECT 'CONFIG_PROXY_PORT=' "CONFIG_PROXY_PORT=$PROXY_PORT" /DietPi/dietpi.txt ;; 'Username') G_WHIP_DEFAULT_ITEM=$PROXY_USERNAME - G_WHIP_INPUTBOX 'Please enter the proxy username\n - eg: JoeBloggs\n - Leave blank if not required' - (( $? == 0 )) && PROXY_USERNAME=$G_WHIP_RETURNED_VALUE + G_WHIP_INPUTBOX 'Please enter the proxy username\n - eg: JoeBloggs\n - Leave blank if not required' && PROXY_USERNAME=$G_WHIP_RETURNED_VALUE + G_CONFIG_INJECT 'CONFIG_PROXY_USERNAME=' "CONFIG_PROXY_USERNAME=$PROXY_USERNAME" /DietPi/dietpi.txt ;; 'Password') G_WHIP_DEFAULT_ITEM=$PROXY_PASSWORD - G_WHIP_INPUTBOX 'Please enter the proxy password\n - eg: LetMeIn\n - Leave blank if not required' - (( $? == 0 )) && PROXY_PASSWORD=$G_WHIP_RETURNED_VALUE + G_WHIP_INPUTBOX 'Please enter the proxy password\n - eg: LetMeIn\n - Leave blank if not required' && PROXY_PASSWORD=$G_WHIP_RETURNED_VALUE + G_CONFIG_INJECT 'CONFIG_PROXY_PASSWORD=' "CONFIG_PROXY_PASSWORD=$PROXY_PASSWORD" /DietPi/dietpi.txt ;; - 'Apply') - - # - Save settings to dietpi.txt - G_CONFIG_INJECT 'CONFIG_PROXY_ENABLED=' "CONFIG_PROXY_ENABLED=$PROXY_ENABLED" /DietPi/dietpi.txt - G_CONFIG_INJECT 'CONFIG_PROXY_ADDRESS=' "CONFIG_PROXY_ADDRESS=$PROXY_ADDRESS" /DietPi/dietpi.txt - G_CONFIG_INJECT 'CONFIG_PROXY_PORT=' "CONFIG_PROXY_PORT=$PROXY_PORT" /DietPi/dietpi.txt - G_CONFIG_INJECT 'CONFIG_PROXY_USERNAME=' "CONFIG_PROXY_USERNAME=$PROXY_USERNAME" /DietPi/dietpi.txt - G_CONFIG_INJECT 'CONFIG_PROXY_PASSWORD=' "CONFIG_PROXY_PASSWORD=$PROXY_PASSWORD" /DietPi/dietpi.txt - - # - Delete active export vars - #unset {http,https,ftp}_proxy #Does not apply to system when running from a bash script. + esac - # - Delete any existing export settings from /etc/bash.bashrc - sed -i '/^[[:blank:]]*{http,https,ftp}_proxy=/d' /etc/bash.bashrc + # - Add export settings + if (( $PROXY_ENABLED )); then - # - Add export settings - if (( $PROXY_ENABLED )); then + if [[ $PROXY_USERNAME && $PROXY_PASSWORD ]]; then - if [[ $PROXY_USERNAME && $PROXY_PASSWORD ]]; then - cat << _EOF_ >> /etc/bash.bashrc + cat << _EOF_ > /etc/bashrc.d/dietpi-proxy.sh export {http,https,ftp}_proxy="http://$PROXY_USERNAME:$PROXY_PASSWORD@$PROXY_ADDRESS:$PROXY_PORT" _EOF_ - else - cat << _EOF_ >> /etc/bash.bashrc + else + + cat << _EOF_ > /etc/bashrc.d/dietpi-proxy.sh export {http,https,ftp}_proxy="http://$PROXY_ADDRESS:$PROXY_PORT" _EOF_ - fi - - - fi - - # - Ask user for reboot now to activate/disable proxy - REBOOT_REQUIRED=1 + fi - G_WHIP_YESNO 'The updated proxy settings have been saved.\n\nNB: You must reboot your system, before the new proxy settings will take effect.\n\nReboot system now?' - (( $? == 0 )) && reboot + else - # - Reset init flag to force a reload of setings next time this menu is run. - PROXY_ENABLED=-1 + [[ -f '/etc/bashrc.d/dietpi-proxy.sh' ]] && rm /etc/bashrc.d/dietpi-proxy.sh + unset {http,https,ftp}_proxy # Has no effect on current login session but for this script, e.g. connection test - ;; + fi - esac + REBOOT_REQUIRED=1 - #Reset init flag to force a reload of setings next time this menu is run. else - PROXY_ENABLED=-1 + TARGETMENUID=8 # Return to Network Adapters menu fi @@ -4774,7 +4750,7 @@ _EOF_ #///////////////////////////////////////////////////////////////////////////////////// if (( $G_DIETPI_INSTALL_STAGE >= 0 )); then - #Start DietPi-Config + # Start DietPi-Config while (( $TARGETMENUID >= 0 )); do printf '\ec' # clear current terminal screen @@ -4853,6 +4829,10 @@ _EOF_ Menu_NetworkAdapters_Proxy + elif (( $TARGETMENUID == 18 )); then + + Menu_AdvancedOptions_Serial_UART + else G_WHIP_MSG "[FAILED] Unknown menu ID $TARGETMENUID, reverting to DietPi-Config main menu\n @@ -4866,7 +4846,7 @@ Please report it to: https://github.com/MichaIng/DietPi/issues" else - echo -e ' >> Filesystem prep has not yet completed:\n Please wait for the system to reboot' + G_WHIP_MSG '[INFO] First run setup has not reached sufficient state.\n\nPlease reboot before using DietPi-Config. If the issue persists, please report this as bug.' fi diff --git a/dietpi/dietpi-drive_manager b/dietpi/dietpi-drive_manager index 50a7ee7a5c..4924ff1e4b 100644 --- a/dietpi/dietpi-drive_manager +++ b/dietpi/dietpi-drive_manager @@ -17,16 +17,15 @@ # #//////////////////////////////////// - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals G_PROGRAM_NAME='DietPi-Drive_Manager' G_CHECK_ROOT_USER G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- #Grab Input (valid interger) - INPUT=0 - disable_error=1 G_CHECK_VALIDINT "$1" && INPUT=$1 + disable_error=1 G_CHECK_VALIDINT "$1" && INPUT=$1 || INPUT=0 EXIT_CODE=0 @@ -127,7 +126,7 @@ # Mounts local swap_mount='' local tmpfs_mounts='' - local bind_mounts='' + local misc_mounts='' local net_mounts='' # Mode 4: Force reset/clean fstab (PREP) @@ -143,56 +142,57 @@ tmpfs /DietPi tmpfs defaults,size=10m,noatime,nodev,nosuid,mode=1777 0 0" swap_mount=$(grep -m1 '[[:blank:]]swap[[:blank:]]' $FP_TEMP_FSTAB) tmpfs_mounts=$(grep '^tmpfs[[:blank:]]' $FP_TEMP_FSTAB) - bind_mounts=$(grep '[[:blank:],]bind[[:blank:],]' $FP_TEMP_FSTAB) + # encryptfs, vboxsf, bind mounts + misc_mounts=$(grep -E '([[:blank:],]bind[[:blank:],]|[[:blank:]](encryptfs|vboxsf)[[:blank:]])' $FP_TEMP_FSTAB) # CurlFtpFS, CIFS/SMB/Samba, NFS - net_mounts=$(grep -E '(^curlftpfs|[[:blank:]]cifs[[:blank:]]|[[:blank:]]nfs[4]?[[:blank:]])' $FP_TEMP_FSTAB) + net_mounts=$(grep -E '(^curlftpfs|[[:blank:]](cifs|nfs4?)[[:blank:]])' $FP_TEMP_FSTAB) fi - echo "#----------------------------------------------------------- -#NETWORK -#----------------------------------------------------------- -#Please use DietPi-Drive_Manager to setup network mounts + echo "# Please use \"dietpi-drive_manager\" to setup mounts +#---------------------------------------------------------------- +# NETWORK +#---------------------------------------------------------------- $net_mounts -#----------------------------------------------------------- -#TMPFS -#----------------------------------------------------------- +#---------------------------------------------------------------- +# TMPFS +#---------------------------------------------------------------- $tmpfs_mounts -#----------------------------------------------------------- -#MISC (bind) -#----------------------------------------------------------- -$bind_mounts +#---------------------------------------------------------------- +# MISC: encryptfs, vboxsf (VirtualBox shared folder), bind mounts +#---------------------------------------------------------------- +$misc_mounts -#----------------------------------------------------------- -#SWAPFILE -#----------------------------------------------------------- +#---------------------------------------------------------------- +# SWAPFILE +#---------------------------------------------------------------- $swap_mount -#----------------------------------------------------------- -#PHYSICAL DRIVES -#-----------------------------------------------------------" > $FP_TEMP_FSTAB +#---------------------------------------------------------------- +# PHYSICAL DRIVES +#----------------------------------------------------------------" > $FP_TEMP_FSTAB # Detect mounted drives and add them to fstab G_DIETPI-NOTIFY 2 'Detecting drives, please wait...' df -Pha | tail -n +2 > .dietpi-drive_manager_df_tmp - # - Remove items from list - # Bind: https://github.com/MichaIng/DietPi/issues/2013#issuecomment-416394374 + # - Remove misc items from list + # bind: https://github.com/MichaIng/DietPi/issues/2013#issuecomment-416394374 while read line do [[ $line ]] || continue - # - Bind - local input_bind_mount_source=$(mawk '{print $1}' <<< $line) - local input_bind_mount_target=$(mawk '{print $2}' <<< $line) - sed -i "\#[[:blank:]]$input_bind_mount_target#d" .dietpi-drive_manager_df_tmp - sed -i "\#[[:blank:]]$input_bind_mount_source#d" .dietpi-drive_manager_df_tmp - [[ $G_DEBUG == 1 ]] && G_DIETPI-NOTIFY 0 " - Detected bind mount and removed from df scrape: $input_bind_mount_source > $input_bind_mount_target" + local input_mount_target=$(mawk '{print $2}' <<< $line) + sed -i "\#[[:blank:]]$input_mount_target$#d" .dietpi-drive_manager_df_tmp + # - target + source removal via $6 required for bind mounts: https://github.com/MichaIng/DietPi/issues/2013#issuecomment-417413867 + local input_mount_source=$(mawk '{print $1}' <<< $line) + sed -i "\#[[:blank:]]$input_mount_source$#d" .dietpi-drive_manager_df_tmp + [[ $G_DEBUG == 1 ]] && G_DIETPI-NOTIFY 0 " - Detected misc mount and removed from df scrape: $input_mount_source > $input_mount_target" - done <<< "$bind_mounts" + done <<< "$misc_mounts" # - Process final DF result while read line @@ -782,7 +782,7 @@ aDRIVE_ISPARTITIONTABLE ${aDRIVE_ISPARTITIONTABLE[$i]} sed -i "\@[[:space:]]/[[:space:]][[:space:]]*auto@c $dev_entry / auto defaults,noatime,rw 0 1" /etc/fstab # - Disable Swap - /DietPi/dietpi/func/dietpi-set_dphys-swapfile 0 + /DietPi/dietpi/func/dietpi-set_swapfile 0 rsync -aHv --delete --exclude '/boot/*' --exclude '/lost+found/' --exclude '/mnt/*' --exclude ${aDRIVE_MOUNT_TARGET[$INDEX_DRIVE_BEING_EDITED]}/ --exclude '/sys/*' --exclude '/proc/*' / "${aDRIVE_MOUNT_TARGET[$INDEX_DRIVE_BEING_EDITED]}"/ if (( $? )); then @@ -796,7 +796,7 @@ aDRIVE_ISPARTITIONTABLE ${aDRIVE_ISPARTITIONTABLE[$i]} fi # - Recreate swap - # /DietPi/dietpi/func/dietpi-set_dphys-swapfile 1 ${aDRIVE_MOUNT_TARGET[$INDEX_DRIVE_BEING_EDITED]}/var/swap/.swap + # /DietPi/dietpi/func/dietpi-set_swapfile 1 ${aDRIVE_MOUNT_TARGET[$INDEX_DRIVE_BEING_EDITED]}/var/swap/.swap # Manually update location # sed -i "/^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=/c\AUTO_SETUP_SWAPFILE_LOCATION=/var/swap" /DietPi/dietpi.txt @@ -1318,7 +1318,7 @@ aDRIVE_ISPARTITIONTABLE ${aDRIVE_ISPARTITIONTABLE[$i]} local fp_target_swapfile="${aDRIVE_MOUNT_TARGET[$INDEX_DRIVE_BEING_EDITED]}/.swapfile" [[ ${aDRIVE_MOUNT_TARGET[$INDEX_DRIVE_BEING_EDITED]} == '/' ]] && fp_target_swapfile='/var/swap' - /DietPi/dietpi/func/dietpi-set_dphys-swapfile $G_WHIP_RETURNED_VALUE "$fp_target_swapfile" + /DietPi/dietpi/func/dietpi-set_swapfile $G_WHIP_RETURNED_VALUE "$fp_target_swapfile" fi diff --git a/dietpi/dietpi-letsencrypt b/dietpi/dietpi-letsencrypt index e8238fd4c7..52d7f6dbf9 100644 --- a/dietpi/dietpi-letsencrypt +++ b/dietpi/dietpi-letsencrypt @@ -17,33 +17,31 @@ # - /DietPi/dietpi/dietpi-letsencrypt 1 = Create/Renew/Apply cert #//////////////////////////////////// - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals G_PROGRAM_NAME='DietPi-LetsEncrypt' G_CHECK_ROOT_USER G_CHECK_ROOTFS_RW G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- - #Grab Input - INPUT=0 - disable_error=1 G_CHECK_VALIDINT "$1" && INPUT=$1 + # Grab Input + disable_error=1 G_CHECK_VALIDINT "$1" && INPUT=$1 || INPUT=0 #///////////////////////////////////////////////////////////////////////////////////// - #Globals + # Globals #///////////////////////////////////////////////////////////////////////////////////// FP_LOGFILE='/var/log/dietpi-letsencrypt.log' - # On Stretch+ the APT package installs a systemd unit for cert renewal, - # on Jessie-, we install the CertBot from github directly and add a cron job for renewal: + # On Stretch+ the APT package installs a systemd unit for cert renewal. FP_RENEWAL='/etc/systemd/system/certbot.service.d' + # On Jessie- we install the CertBot from GitHub directly and add a cron job for renewal. (( $G_DISTRO < 4 )) && FP_RENEWAL='/etc/cron.weekly/dietpi-letsencrypt' FP_BINARY='/usr/bin/certbot' (( $G_DISTRO < 4 )) && FP_BINARY='/etc/certbot_scripts/certbot-auto' - LETSENCRYPT_INSTALLED=0 - [[ -f $FP_BINARY ]] && LETSENCRYPT_INSTALLED=1 + [[ -f $FP_BINARY ]] && LETSENCRYPT_INSTALLED=1 || LETSENCRYPT_INSTALLED=0 LETSENCRYPT_DOMAIN='mydomain.com' LETSENCRYPT_EMAIL='myemail@email.com' @@ -58,26 +56,24 @@ local fp_cert_dir="/etc/letsencrypt/live/$LETSENCRYPT_DOMAIN" #------------------------------------------------------------------------------------------------------ - #Apache2 + # Apache2 if pgrep '[a]pache' &> /dev/null; then G_DIETPI-NOTIFY 0 'Apache2 webserver detected' local fp_defaultsite='/etc/apache2/sites-available/000-default.conf' - #Add ServerName if it doesnt exist. This is required to prevent CertBot compaining about vhost with no domain. + # - Add ServerName if it doesnt exist. This is required to prevent CertBot complaining about vhost with no domain. G_CONFIG_INJECT 'ServerName[[:blank:]]' "ServerName $LETSENCRYPT_DOMAIN" "$fp_defaultsite" ' 3 )) && options='-a webroot -w /var/www/ -i apache' (( $LETSENCRYPT_REDIRECT )) && options+=' --redirect' || options+=' --no-redirect' (( $LETSENCRYPT_HSTS )) && options+=' --hsts' - #Cert me up Apache2 - # - When cert exists already, attempt renewal. This allows easy configuration update via "dietpi-letsencrypt 1" without using up limited certs per week. + # - Cert me up Apache2 + # If cert exists already, attempt renewal. This allows easy configuration update via "dietpi-letsencrypt 1" without using up limited certs per week. if [[ -f $fp_cert_dir/cert.pem ]]; then $FP_BINARY renew @@ -85,7 +81,7 @@ else - $FP_BINARY $options --agree-tos --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" + $FP_BINARY $options --agree-tos --no-eff-email --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" local exit_code=$? fi @@ -98,13 +94,12 @@ fi #------------------------------------------------------------------------------------------------------ - #Lighttpd + # Lighttpd elif pgrep '[l]ighttpd' &> /dev/null; then G_DIETPI-NOTIFY 0 'Lighttpd webserver detected' # - Cert me up - /DietPi/dietpi/dietpi-services stop if [[ -f $fp_cert_dir/cert.pem ]]; then $FP_BINARY renew @@ -112,7 +107,7 @@ else - $FP_BINARY certonly --standalone --agree-tos --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" + $FP_BINARY certonly --webroot -w /var/www --agree-tos --no-eff-email --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" local exit_code=$? fi @@ -134,18 +129,18 @@ fi - # Add Lighttpd renewal to certbot system service: + # - Add Lighttpd renewal to certbot systemd service if (( $G_DISTRO > 3 )); then [[ -d $FP_RENEWAL ]] || mkdir "$FP_RENEWAL" cat << _EOF_ > "$FP_RENEWAL"/dietpi-lighttpd.conf [Service] -ExecStartPost=/bin/bash -c '/bin/cat $fp_cert_dir/privkey.pem $fp_cert_dir/cert.pem > $fp_cert_dir/combined.pem' +ExecStartPost=/bin/dash -c 'cat "$fp_cert_dir/privkey.pem" "$fp_cert_dir/cert.pem" > "$fp_cert_dir/combined.pem"' _EOF_ fi - # Allow adding environment variables via: setenv.add-environment + # - Allow adding environment variables via: setenv.add-environment G_CONFIG_INJECT '"mod_setenv"' ' "mod_setenv",' /etc/lighttpd/lighttpd.conf '"mod_.+",' cat << _EOF_ > /etc/lighttpd/conf-enabled/letsencrypt.conf @@ -156,13 +151,13 @@ _EOF_ ssl.disable-client-renegotiation = "enable" # pemfile is cert+privkey, ca-file is the intermediate chain in one file - ssl.pemfile = "$fp_cert_dir/combined.pem" - ssl.ca-file = "$fp_cert_dir/fullchain.pem" + ssl.pemfile = "$fp_cert_dir/combined.pem" + ssl.ca-file = "$fp_cert_dir/fullchain.pem" # for DH/DHE ciphers, dhparam should be >= 2048-bit - #ssl.dh-file = "/path/to/dhparam.pem" + #ssl.dh-file = "/path/to/dhparam.pem" # ECDH/ECDHE ciphers curve strength (see 'openssl ecparam -list_curves') - ssl.ec-curve = "secp384r1" + ssl.ec-curve = "secp384r1" # Compression is by default off at compile-time, but use if needed #ssl.use-compression = "disable" @@ -173,15 +168,15 @@ _EOF_ ssl.use-sslv2 = "disable" ssl.use-sslv3 = "disable" ssl.honor-cipher-order = "enable" - ssl.cipher-list = "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS" + ssl.cipher-list = "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS" } _EOF_ - # Enable new "mod_openssl" on Buster + # - Enable new "mod_openssl" on Buster (( $G_DISTRO > 4 )) && sed -i '1i\server.modules += ( "mod_openssl" )\n' /etc/lighttpd/conf-enabled/letsencrypt.conf - # Redirect - rm /etc/lighttpd/conf-enabled/redirect.conf &> /dev/null + # - Redirect + [[ -f /etc/lighttpd/conf-enabled/redirect.conf ]] && rm /etc/lighttpd/conf-enabled/redirect.conf if (( $LETSENCRYPT_REDIRECT )); then cat << _EOF_ > /etc/lighttpd/conf-enabled/redirect.conf @@ -196,7 +191,7 @@ _EOF_ fi - # HSTS + # - HSTS if (( $LETSENCRYPT_HSTS )); then cat << _EOF_ > /etc/lighttpd/conf-available/99-dietpi-hsts.conf @@ -220,19 +215,17 @@ _EOF_ G_DIETPI-NOTIFY 0 'Nginx webserver detected' local fp_defaultsite='/etc/nginx/sites-available/default' - # Apply domain name + # - Apply domain name G_CONFIG_INJECT 'server_name[[:blank:]]' " server_name $LETSENCRYPT_DOMAIN;" "$fp_defaultsite" 'listen[[:blank:]]' - #Restart Nginx to apply server_name change: + # - Restart Nginx to apply server_name change systemctl restart nginx local options='--nginx' - #Use webroot authentication on Stretch+ for now: https://github.com/MichaIng/DietPi/issues/734#issuecomment-361774084 - (( $G_DISTRO > 3 )) && options='-a webroot -w /var/www/ -i nginx' (( $LETSENCRYPT_REDIRECT )) && options+=' --redirect' || options+=' --no-redirect' (( $LETSENCRYPT_HSTS )) && options+=' --hsts' - #Cert me up Nginx + # - Cert me up Nginx if [[ -f $fp_cert_dir/cert.pem ]]; then $FP_BINARY renew @@ -240,7 +233,7 @@ _EOF_ else - $FP_BINARY $options --agree-tos --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" + $FP_BINARY $options --agree-tos --no-eff-email --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" local exit_code=$? fi @@ -252,7 +245,7 @@ _EOF_ fi - #Apply HSTS header to ownCloud/Nextcloud config + # - Apply HSTS header to ownCloud/Nextcloud config if (( $LETSENCRYPT_HSTS )); then [[ -f /etc/nginx/sites-dietpi/dietpi-owncloud.conf ]] && sed -i 's/#add_header Strict-Transport-Security/add_header Strict-Transport-Security/g' /etc/nginx/sites-dietpi/dietpi-owncloud.conf @@ -261,7 +254,7 @@ _EOF_ fi #------------------------------------------------------------------------------------------------------ - #Minio + # Minio elif pgrep '[m]inio' &> /dev/null; then G_DIETPI-NOTIFY 0 'Minio S3 server detected' @@ -275,7 +268,7 @@ _EOF_ else - $FP_BINARY certonly --standalone --staple-ocsp --agree-tos --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" + $FP_BINARY certonly --standalone --staple-ocsp --agree-tos --no-eff-email --rsa-key-size "$LETSENCRYPT_KEYSIZE" -m "$LETSENCRYPT_EMAIL" -d "$LETSENCRYPT_DOMAIN" local exit_code=$? fi @@ -287,29 +280,29 @@ _EOF_ fi - # Ensure strict permissions while copying: + # - Ensure strict permissions while copying: umask 077 - # Locate them correctly (THIS didn't work as symlinks) - G_RUN_CMD cp "$fp_cert_dir"/fullchain.pem /home/minio-user/.minio/certs/public.crt - G_RUN_CMD cp "$fp_cert_dir"/privkey.pem /home/minio-user/.minio/certs/private.key + # - Locate them correctly (THIS didn't work as symlinks) + G_RUN_CMD cp "$fp_cert_dir/fullchain.pem" /home/minio-user/.minio/certs/public.crt + G_RUN_CMD cp "$fp_cert_dir/privkey.pem" /home/minio-user/.minio/certs/private.key - # Own those certs! + # - Own those certs! G_RUN_CMD chown minio-user:minio-user /home/minio-user/.minio/certs/public.crt /home/minio-user/.minio/certs/private.key G_RUN_CMD chmod 400 /home/minio-user/.minio/certs/public.crt /home/minio-user/.minio/certs/private.key - # Creation permissions back to default: + # - Creation permissions back to default: umask 022 - # Add SSL to config file + # - Add SSL to config file G_CONFIG_INJECT 'MINIO_OPTS="' 'MINIO_OPTS="--address :443"' /etc/default/minio - # Allow SSL binding for non root user - # - Install libcap2-bin, which provides setcap command, not installed by default on DietPi: + # - Allow SSL binding for non root user + # Install libcap2-bin, which provides setcap command, not installed by default on DietPi: G_AGI libcap2-bin G_RUN_CMD setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/minio - # Create renewl script + # - Create renewl script cat << _EOF_ > /home/minio-user/.minio/dietpi-cert-renewl.sh #!/bin/bash # Minio only works with copied and owned certs. Upon renewal the new certs needs to be copied and re-owned @@ -319,8 +312,8 @@ systemctl stop minio umask 077 # Copy to correct Location -cp $fp_cert_dir/fullchain.pem /home/minio-user/.minio/certs/public.crt -cp $fp_cert_dir/privkey.pem /home/minio-user/.minio/certs/private.key +cp "$fp_cert_dir/fullchain.pem" /home/minio-user/.minio/certs/public.crt +cp "$fp_cert_dir/privkey.pem" /home/minio-user/.minio/certs/private.key # Re-Own those certs! chown minio-user:minio-user /home/minio-user/.minio/certs/public.crt /home/minio-user/.minio/certs/private.key @@ -329,10 +322,10 @@ chmod 400 /home/minio-user/.minio/certs/public.crt /home/minio-user/.minio/certs systemctl start minio _EOF_ - # Change permissions on renewal script + # - Change permissions on renewal script G_RUN_CMD chmod +x /home/minio-user/.minio/dietpi-cert-renewl.sh - # Add Minio renewal to certbot system service: + # Add Minio renewal to certbot system service if (( $G_DISTRO > 3 )); then [[ -d $FP_RENEWAL ]] || mkdir "$FP_RENEWAL" @@ -359,35 +352,7 @@ Would you like to switch to DietPi-Software, to install one of the above?' && /D fi - if [[ -f /etc/turnserver.conf ]]; then - - G_DIETPI-NOTIFY 2 'coturn TURN server detected' - - # - Get TURN port - local turn_port=5349 - if grep -q '^[[:blank:]]*tls-listening-port=' /etc/turnserver.conf; then - - turn_port=$(grep -m1 '^[[:blank:]]*tls-listening-port=' /etc/turnserver.conf) - turn_port=${turn_port#*tls-listening-port=} - - elif grep -q '^[[:blank:]]*listening-port=' /etc/turnserver.conf; then - - turn_port=$(grep -m1 '^[[:blank:]]*listening-port=' /etc/turnserver.conf) - turn_port=${turn_port#*listening-port=} - # - Comment non-TLS port setting to avoid doubled port use - G_CONFIG_INJECT 'listening-port=' "#listening-port=$turn_port" /etc/turnserver.conf - - fi - - # - Set TURN TLS settings - G_CONFIG_INJECT 'tls-listening-port=' "tls-listening-port=$turn_port" /etc/turnserver.conf - G_CONFIG_INJECT 'cert=' "cert=$fp_cert_dir/cert.pem" /etc/turnserver.conf - G_CONFIG_INJECT 'pkey=' "pkey=$fp_cert_dir/privkey.pem" /etc/turnserver.conf - G_CONFIG_INJECT 'cipher-list=' 'cipher-list="ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5"' /etc/turnserver.conf - - fi - - #ALL | Create cert renewal cron job on Jessie-: + # ALL | Create cert renewal cron job on Jessie-: if (( $G_DISTRO < 4 )); then cat << _EOF_ > "$FP_RENEWAL" @@ -409,7 +374,7 @@ Would you like to switch to DietPi-Software, to install one of the above?' && /D $FP_BINARY -q renew &>> $FP_LOGFILE [[ -f /home/minio-user/.minio/dietpi-cert-renewl.sh ]] && /home/minio-user/.minio/dietpi-cert-renewl.sh &>> $FP_LOGFILE - [[ -f $fp_cert_dir/combined.pem ]] && cat $fp_cert_dir/privkey.pem $fp_cert_dir/cert.pem > $fp_cert_dir/combined.pem 2>> $FP_LOGFILE + [[ -f $fp_cert_dir/combined.pem ]] && cat "$fp_cert_dir/privkey.pem" "$fp_cert_dir/cert.pem" > "$fp_cert_dir/combined.pem" 2>> $FP_LOGFILE #---------------------------------------------------------------- exit @@ -443,19 +408,17 @@ _EOF_ Read_Settings_File(){ - local sed_index=1 - - LETSENCRYPT_DOMAIN=$(sed -n "$sed_index"p "$FP_SETTINGS");((sed_index++)) - LETSENCRYPT_EMAIL=$(sed -n "$sed_index"p "$FP_SETTINGS");((sed_index++)) - LETSENCRYPT_REDIRECT=$(sed -n "$sed_index"p "$FP_SETTINGS");((sed_index++)) - LETSENCRYPT_HSTS=$(sed -n "$sed_index"p "$FP_SETTINGS");((sed_index++)) - LETSENCRYPT_KEYSIZE=$(sed -n "$sed_index"p "$FP_SETTINGS");((sed_index++)) + LETSENCRYPT_DOMAIN=$(sed -n 1p $FP_SETTINGS) + LETSENCRYPT_EMAIL=$(sed -n 2p $FP_SETTINGS) + LETSENCRYPT_REDIRECT=$(sed -n 3p $FP_SETTINGS) + LETSENCRYPT_HSTS=$(sed -n 4p $FP_SETTINGS) + LETSENCRYPT_KEYSIZE=$(sed -n 5p $FP_SETTINGS) } Write_Settings_File(){ - cat << _EOF_ > "$FP_SETTINGS" + cat << _EOF_ > $FP_SETTINGS $LETSENCRYPT_DOMAIN $LETSENCRYPT_EMAIL $LETSENCRYPT_REDIRECT @@ -476,18 +439,37 @@ _EOF_ G_WHIP_SIZE_X_MAX=50 if G_WHIP_YESNO "Exit $G_PROGRAM_NAME?"; then - #exit + # Exit TARGETMENUID=-1 else - #Return to Main Menu + # Return to Main Menu TARGETMENUID=0 fi } + Input_Box(){ + + local input_value=$1 + local input_desc=$2 + + G_WHIP_DEFAULT_ITEM=$input_value + if G_WHIP_INPUTBOX "Please enter a value for $input_desc"; then + + input_value=$G_WHIP_RETURNED_VALUE + + # Prevent null values + [[ $input_value ]] || input_value='NULL' + + fi + + echo "$input_value" + + } + #TARGETMENUID=0 Menu_Main(){ @@ -521,8 +503,8 @@ _EOF_ while : do - LETSENCRYPT_DOMAIN=$(Input_Box $LETSENCRYPT_DOMAIN Website-Domain) - [[ $LETSENCRYPT_DOMAIN == *?.?* && ! $(sed 's/\.//g' <<< $LETSENCRYPT_DOMAIN) =~ ^[0-9]*$ ]] && break + LETSENCRYPT_DOMAIN=$(Input_Box "$LETSENCRYPT_DOMAIN" Website-Domain) + [[ $LETSENCRYPT_DOMAIN == *?.?* && ! $(sed 's/\.//g' <<< "$LETSENCRYPT_DOMAIN") =~ ^[0-9]*$ ]] && break G_WHIP_MSG "[FAILED] \"$LETSENCRYPT_DOMAIN\" is no valid domain name.\n\nNote that raw IP addresses are not allowed by LetsEncrypt, thus a domain is required.\nYou can install No-IP with DietPi-Software to aquire one.\n\nPlease try again..." @@ -532,13 +514,13 @@ _EOF_ 'Email') - LETSENCRYPT_EMAIL=$(Input_Box $LETSENCRYPT_EMAIL Email-Address) + LETSENCRYPT_EMAIL=$(Input_Box "$LETSENCRYPT_EMAIL" Email-Address) ;; 'Key Size') - (( $LETSENCRYPT_KEYSIZE == 2048 )) && LETSENCRYPT_KEYSIZE=4096 || LETSENCRYPT_KEYSIZE=2048 + (( $LETSENCRYPT_KEYSIZE == 4096 )) && LETSENCRYPT_KEYSIZE=2048 || LETSENCRYPT_KEYSIZE=4096 ;; @@ -578,8 +560,13 @@ Are you sure that you want to enable HTTP Strict Transport Security?' && LETSENC 'Apply') - G_WHIP_YESNO "LetsEncrypt will now be run. This will:\n- Create your free SSL cert.\n- Automatically apply and enable your SSL cert\n- NB: This process can take a long time, please be patient.\n- NB: HTTPS will automatically be applied to the webserver and applications which use '/var/www/*'. Applications which use their own webserver (these usually have their own :port number), will not be available under HTTPS, and, these will need to be configured manually.\n\nWould you like to continue?" - if (( ! $? )); then + if G_WHIP_YESNO 'LetsEncrypt will now be run. This will: +- Create your free SSL cert. +- Automatically apply and enable your SSL cert +- NB: This process can take a long time, please be patient. +- NB: HTTPS will automatically be applied to the webserver and applications which use "/var/www/*". + Applications which use their own webserver (these usually have their own :port number), will not be available under HTTPS, and, these will need to be configured manually.\n +Would you like to continue?'; then Write_Settings_File Run_Lets_Encrypt @@ -593,36 +580,17 @@ Are you sure that you want to enable HTTP Strict Transport Security?' && LETSENC else - #Exit + # Exit Menu_Exit fi } - Input_Box(){ - - local input_value=$1 - local input_desc=$2 - - G_WHIP_DEFAULT_ITEM=$input_value - if G_WHIP_INPUTBOX "Please enter a value for $input_desc"; then - - input_value=$G_WHIP_RETURNED_VALUE - - # - Prevent null values - [[ $input_value ]] || input_value='NULL' - - fi - - echo "$input_value" - - } - #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// - #Load Settings file. Generate if required. + # Load Settings file. Generate if required. if [[ -f $FP_SETTINGS ]]; then Read_Settings_File @@ -634,10 +602,10 @@ Are you sure that you want to enable HTTP Strict Transport Security?' && LETSENC fi #----------------------------------------------------------------------------------- - #Check installed + # Check installed if (( ! $LETSENCRYPT_INSTALLED )); then - #Menu + # Menu if (( ! $INPUT )); then G_DIETPI-NOTIFY 1 "CertBot binary not found ( $FP_BINARY )" @@ -651,7 +619,7 @@ Are you sure that you want to enable HTTP Strict Transport Security?' && LETSENC fi #----------------------------------------------------------------------------------- - #Menu + # Menu elif (( ! $INPUT )); then while (( $TARGETMENUID > -1 )); do @@ -663,7 +631,7 @@ Are you sure that you want to enable HTTP Strict Transport Security?' && LETSENC done #----------------------------------------------------------------------------------- - #Run + # Run elif (( $INPUT == 1 )); then Run_Lets_Encrypt @@ -673,7 +641,7 @@ Are you sure that you want to enable HTTP Strict Transport Security?' && LETSENC G_DIETPI-NOTIFY 2 'DietPi-LetsEncrypt usage:' G_DIETPI-NOTIFY 2 ' dietpi-letsencrypt => Open whiptail menu' - G_DIETPI-NOTIFY 2 ' dietpi-letsencrypt 1 => Create/Renew/Apply certs without user input' + G_DIETPI-NOTIFY 2 ' dietpi-letsencrypt 1 => Create/Renew/Apply certs non-interactively' fi diff --git a/dietpi/dietpi-login b/dietpi/dietpi-login index 1030319b6f..4e2301e64d 100644 --- a/dietpi/dietpi-login +++ b/dietpi/dietpi-login @@ -177,7 +177,7 @@ Please login again as user "root" with password "dietpi", respectively the one y # Wait for full system boot local i=0 - until sudo systemctl -ln 0 --no-pager status dietpi-postboot | grep -qi 'exited' # "sudo" required for non-root logins + while pgrep -f '/DietPi/dietpi/postboot' &> /dev/null do echo -ne "\e[90m[\e[0m INFO \e[90m]\e[0m Waiting for DietPi-Postboot to finish... (Press CTRL+C to abort) ($((i++)))\r" @@ -192,6 +192,8 @@ Please login again as user "root" with password "dietpi", respectively the one y . /DietPi/dietpi/func/dietpi-globals G_PROGRAM_NAME='DietPi-Login' #G_INIT # To allow concurrent logins + # - Always remove PID file when script is killed + trap '[[ -f $FP_DIETPI_FIRSTRUNSETUP_PID ]] && rm $FP_DIETPI_FIRSTRUNSETUP_PID' EXIT # Import DietPi-Globals -------------------------------------------------------------- /DietPi/dietpi/func/obtain_network_details diff --git a/dietpi/dietpi-process_tool b/dietpi/dietpi-process_tool index d49012ad0a..27cff3f857 100644 --- a/dietpi/dietpi-process_tool +++ b/dietpi/dietpi-process_tool @@ -277,7 +277,7 @@ aNAME[$index]='Sonarr';aPROCESS_NAME[$index]='NzbDrone.exe';((index++)) aNAME[$index]='Spotify Connect Web';aPROCESS_NAME[$index]='spotify-connect-web';((index++)) aNAME[$index]='Supervisor';aPROCESS_NAME[$index]='supervisor';((index++)) - aNAME[$index]='Squeezebox Server (LMS)';aPROCESS_NAME[$index]='squeezeboxserver';((index++)) + aNAME[$index]='Logitech Media Server';aPROCESS_NAME[$index]='squeezeboxserver';((index++)) aNAME[$index]='Squeezelite';aPROCESS_NAME[$index]='squeezelite';((index++)) aNAME[$index]='Syncthing';aPROCESS_NAME[$index]='syncthing';((index++)) aNAME[$index]='Syncthing-inotify';aPROCESS_NAME[$index]='syncthing-inotify';((index++)) @@ -437,7 +437,7 @@ Write_Settings_File(){ - rm $FP_SETTINGS &> /dev/null + [[ -f $FP_SETTINGS ]] && rm $FP_SETTINGS local save_index=0 for i in ${!aNAME[@]} diff --git a/dietpi/dietpi-services b/dietpi/dietpi-services index 0bbc035aa1..bb37abe636 100644 --- a/dietpi/dietpi-services +++ b/dietpi/dietpi-services @@ -65,7 +65,9 @@ # - PHP 'php5-fpm' 'php7.0-fpm' + 'php7.1-fpm' 'php7.2-fpm' + 'php7.3-fpm' # - Webservers 'apache2' @@ -102,7 +104,7 @@ # - Media 'ympd' 'mympd' - 'squeezeboxserver' + 'logitechmediaserver' 'subsonic' 'airsonic' 'mopidy' @@ -199,7 +201,7 @@ # - SSH aSERVICE_NAME+=('dropbear') - aSERVICE_NAME+=('ssh') #: OpenSSH-server + aSERVICE_NAME+=('ssh') #: OpenSSH Server # - Misc #aSERVICE_NAME+=('systemd-timesyncd') #: Timesync. DietPi stops this by default after success, may confuse user/prompt questions. @@ -208,7 +210,7 @@ aSERVICE_NAME+=('openvpn') #: https://github.com/MichaIng/DietPi/issues/1501 aSERVICE_NAME+=('vncserver') #: DietPi vnc server service/script aSERVICE_NAME+=('nxserver') #: Nomachine - aSERVICE_NAME+=('xrdp') #: XRDP server + aSERVICE_NAME+=('xrdp') #: XRDP Server aSERVICE_NAME+=('amiberry') #: DietPi AmiBerry run service # - DietPi @@ -219,6 +221,7 @@ aSERVICE_NAME+=('dietpi-postboot') aSERVICE_NAME+=('dietpi-wifi-monitor') #: https://github.com/MichaIng/DietPi/issues/1288#issuecomment-350653480 aSERVICE_NAME+=('dietpi-nordvpn') #: NordVPN install + client + aSERVICE_NAME+=('dietpi-arr_to_RAM') #: Sonarr/Radarr/Lidarr database to RAM link service #aSERVICE_NAME+=('wg-quick@wg0') #: WireGuard fi @@ -412,7 +415,7 @@ if (( ${aSERVICE_AVAILABLE[$i]} )); then - G_DIETPI-NOTIFY -2 "${aSERVICE_NAME[$i]}" + G_DIETPI-NOTIFY -2 ${aSERVICE_NAME[$i]} systemctl $target_state ${aSERVICE_NAME[$i]} &> /dev/null @@ -430,7 +433,7 @@ if (( ${aSERVICE_AVAILABLE[$i]} )); then - G_DIETPI-NOTIFY -2 "${aSERVICE_NAME[$i]}" + G_DIETPI-NOTIFY -2 ${aSERVICE_NAME[$i]} systemctl $target_state ${aSERVICE_NAME[$i]} &> /dev/null @@ -499,7 +502,7 @@ _EOF_ #Apply if (( ${aSERVICE_AVAILABLE[$i]} )); then - G_DIETPI-NOTIFY -2 "${aSERVICE_NAME[$i]}" + G_DIETPI-NOTIFY -2 ${aSERVICE_NAME[$i]} systemctl $SYSTEMD_CMD ${aSERVICE_NAME[$i]} &> /dev/null @@ -568,7 +571,7 @@ _EOF_ #Apply if (( ${aSERVICE_AVAILABLE[$i]} )); then - STATUS=${aSERVICE_NAME[$i]}\t$(systemctl status ${aSERVICE_NAME[$i]} | grep -m1 'Active' | cut -c12-) + STATUS="${aSERVICE_NAME[$i]}\t$(systemctl status ${aSERVICE_NAME[$i]} | grep -m1 'Active' | cut -c12-)" if [[ $STATUS =~ 'failed' ]]; then diff --git a/dietpi/dietpi-software b/dietpi/dietpi-software index 68c0204fbf..764f64e747 100644 --- a/dietpi/dietpi-software +++ b/dietpi/dietpi-software @@ -21,24 +21,24 @@ # - /DietPi/dietpi/dietpi-software list #Lists UNIQUEIDs for software. #//////////////////////////////////// - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals --------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals G_PROGRAM_NAME='DietPi-Software' G_CHECK_ROOT_USER G_CHECK_ROOTFS_RW G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals --------------------------------------------------------------- #///////////////////////////////////////////////////////////////////////////////////// - #Filepath + # Filepath #///////////////////////////////////////////////////////////////////////////////////// FP_INSTALLED_FILE='/DietPi/dietpi/.installed' FP_INSTALLED_FILE_TEMP='.installed' - #Used to set user/personal data directories (eg: usbdrive) + # Used to set user/personal data directories (eg: usbdrive) FP_DIETPI_DEDICATED_USBDRIVE='' - #Default user content folders used in DietPi. + # Default user content folders used in DietPi. FOLDER_MUSIC='Music' FOLDER_PICTURES='Pictures' FOLDER_VIDEO='Video' @@ -58,7 +58,7 @@ > $fp_target - #Save installed states + # Save installed states for i in ${!aSOFTWARE_INSTALL_STATE[@]} do @@ -75,22 +75,22 @@ done - #Misc + # Misc cat << _EOF_ >> $fp_target -#DietPi Choice System: SSH Server +# DietPi Choice System: SSH Server INDEX_SSHSERVER_CURRENT=$INDEX_SSHSERVER_CURRENT INDEX_SSHSERVER_TARGET=$INDEX_SSHSERVER_TARGET -#DietPi Choice System: File Server +# DietPi Choice System: File Server INDEX_FILESERVER_CURRENT=$INDEX_FILESERVER_CURRENT INDEX_FILESERVER_TARGET=$INDEX_FILESERVER_TARGET -#DietPi Choice System: Logging +# DietPi Choice System: Logging INDEX_LOGGING_CURRENT=$INDEX_LOGGING_CURRENT INDEX_LOGGING_TARGET=$INDEX_LOGGING_TARGET -#DietPi Preference System: Webserver base +# DietPi Preference System: Webserver base INDEX_WEBSERVER_CURRENT=$INDEX_WEBSERVER_CURRENT INDEX_WEBSERVER_TARGET=$INDEX_WEBSERVER_TARGET _EOF_ @@ -99,16 +99,16 @@ _EOF_ Read_InstallFileList(){ - #Load Software states + # Load Software states G_DIETPI-NOTIFY -2 'Reading database' local fp_target=$FP_INSTALLED_FILE [[ $1 == 'temp' ]] && fp_target=$FP_INSTALLED_FILE_TEMP - #Load + # Load [[ -f $fp_target ]] && . $fp_target - #Always reset choice system during first run to defaults: https://github.com/MichaIng/DietPi/issues/1122 + # Always reset choice system during first run to defaults: https://github.com/MichaIng/DietPi/issues/1122 if (( $G_DIETPI_INSTALL_STAGE == 1 )); then INDEX_SSHSERVER_CURRENT=-1 @@ -142,29 +142,37 @@ _EOF_ #///////////////////////////////////////////////////////////////////////////////////// # Installation System #///////////////////////////////////////////////////////////////////////////////////// - #Reboot after installation has finished. + # Reboot after installation has finished DISABLE_REBOOT=0 - #uninstall flag, used in software installations + removals, runs Uninstall_Software() + # Uninstall flag, used in software installations + removals, runs Uninstall_Software() UNINSTALL_REQUIRED=0 - #Global Password for software installs + # Global password for software installs GLOBAL_PW='' Update_Global_Pw(){ GLOBAL_PW='' + + # - Use new "pbkdf2" function on Buster to resolve warning about deprecated key derivation used: https://github.com/MichaIng/DietPi/issues/2213 + local pbkdf2='' + (( $G_DISTRO > 4 )) && pbkdf2='-iter 10000' + # - Encrypted - if [[ -r '/var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin' ]]; then + if [[ -f '/var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin' ]]; then - # - Use new "pbkdf2" function on Buster to resolve warning about deprecated key derivation used: https://github.com/MichaIng/DietPi/issues/2213 - local pbkdf2='' - (( $G_DISTRO > 4 )) && pbkdf2='-iter 10000' GLOBAL_PW=$(openssl enc -d -a -md sha256 -aes-256-cbc $pbkdf2 -salt -pass pass:'DietPiRocks!' -in /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin) - # - 1st run automated setup only - else + # - 1st run automated setup or user cancelled manual password choice + elif GLOBAL_PW=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=' /DietPi/dietpi.txt | sed 's/^[^=]*=//'); then - GLOBAL_PW=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + G_CONFIG_INJECT 'AUTO_SETUP_GLOBAL_PASSWORD=' 'AUTO_SETUP_GLOBAL_PASSWORD=Password has been encrypted and secured on rootFS' /DietPi/dietpi.txt + openssl enc -e -a -md sha256 -aes-256-cbc $pbkdf2 -salt -pass pass:'DietPiRocks!' -out /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin <<< $GLOBAL_PW + chmod 600 /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin + G_WHIP_MSG '[INFO] For security reasons your global software password has been removed from dietpi.txt and instead saved and ecrypted within: + - /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin\n +DietPi-Software will decrypt and use it for software installs. You can change it via: + - dietpi-config > Security Options > Change Passwords' fi @@ -172,16 +180,16 @@ _EOF_ if [[ ! $GLOBAL_PW ]]; then GLOBAL_PW='dietpi' - G_DIETPI-NOTIFY 1 "Unable to obtain GLOBAL_PW from dietpi.txt (1st run automation only), and, /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin\n\nThe following fallback GLOBAL_PW will be used:\n - $GLOBAL_PW" + G_WHIP_MSG "[ERROR] Unable to obtain your global software password\n\nThe following fallback password will be used:\n - $GLOBAL_PW" fi } - #Total system RAM (used to calculate percentage based value for software cache levels, eg: opcache/apcu max sizes) + # Total system RAM: Used to calculate percentage based value for software cache levels, eg: OPcache/APCu max sizes RAM_TOTAL=$(free -m | mawk '/Mem:/ {print $2;exit}') - #Run Installation Flag (1 = run installs) + # Run Installation Flag (1 = run installs) GOSTARTINSTALL=0 # Install variables @@ -189,67 +197,55 @@ _EOF_ UNINSTALL_URL_ADDRESS='' DEPS_LIST='' - #Special installation Vars + # Special installation Vars USER_EMONHUB_APIKEY_COMPLETED=0 USER_EMONHUB_APIKEY_CURRENT=0 WIFIHOTSPOT_RTL8188C_DEVICE=0 USER_LINUX_AUTOINSTALL_PROMPT_DISPLAYED=0 - #PHP5/7 specific directories, apt package-, module- and command names - # - and Distro specific MariaDB service name - FP_PHP_BASE_DIR='/etc/php/7.0' - PHP_APT_PACKAGE_NAME='php7.0' - PHP_BINARY='php' + # PHP version specific directories, APT package-, module- and command names + # - and distro specific MariaDB service name + FP_PHP_BASE_DIR='/etc/php/7.3' + PHP_NAME='php7.3' + # MariaDB: On Jessie it is still shipped with /etc/init.d/mysql only MARIADB_SERVICE='mariadb' - if (( $G_DISTRO < 4 )); then - - FP_PHP_BASE_DIR='/etc/php5' - PHP_APT_PACKAGE_NAME='php5' - PHP_BINARY='php5' - MARIADB_SERVICE='mysql' - - elif (( $G_DISTRO > 4 )); then - - FP_PHP_BASE_DIR='/etc/php/7.3' - PHP_APT_PACKAGE_NAME='php7.3' - - fi + (( $G_DISTRO < 4 )) && MARIADB_SERVICE='mysql' USBDRIVE=0 - #Choices Made? + # Choices Made? INSTALL_SOFTWARE_CHOICESMADE=0 - #DietPi Choice System: SSH Server - #NB: Update Read_InstallFileList with defaults + # DietPi Choice System: SSH Server + # NB: Update Read_InstallFileList with defaults INSTALL_SSHSERVER_CHOICESMADE=0 INDEX_SSHSERVER_CURRENT=-1 INDEX_SSHSERVER_TARGET=-1 - #DietPi Choice System: Fileserver - #NB: Update Read_InstallFileList with defaults + # DietPi Choice System: Fileserver + # NB: Update Read_InstallFileList with defaults INSTALL_FILESERVER_CHOICESMADE=0 INDEX_FILESERVER_CURRENT=0 INDEX_FILESERVER_TARGET=0 - #DietPi Choice System: Logging - #NB: Update Read_InstallFileList with defaults + # DietPi Choice System: Logging + # NB: Update Read_InstallFileList with defaults INSTALL_LOGGING_CHOICESMADE=0 INDEX_LOGGING_CURRENT=-1 INDEX_LOGGING_TARGET=-1 - #DietPi Preference System: Webserver base - #NB: Update Read_InstallFileList with defaults + # DietPi Preference System: Webserver base + # NB: Update Read_InstallFileList with defaults INDEX_WEBSERVER_CURRENT=-2 INDEX_WEBSERVER_TARGET=-2 FP_ONLINEDOC_URL='https://dietpi.com/phpbb/viewtopic.php?' - # - Available for - MAX_G_HW_MODEL=71 #This needs to match highest G_HW_MODEL value in dietpi-obtain_hw_model - MAX_G_HW_ARCH=10 #This needs to match highest G_HW_ARCH value in dietpi-obtain_hw_model - MAX_G_DISTRO=5 #This needs to match highest G_DISTRO value in dietpi-obtain_hw_model - # 2D array (well, bash style) + # Available for + MAX_G_HW_MODEL=71 # This needs to match highest G_HW_MODEL value in dietpi-obtain_hw_model + MAX_G_HW_ARCH=10 # This needs to match highest G_HW_ARCH value in dietpi-obtain_hw_model + MAX_G_DISTRO=5 # This needs to match highest G_DISTRO value in dietpi-obtain_hw_model + # - 2D array (well, bash style) declare -A aSOFTWARE_AVAIL_G_HW_MODEL declare -A aSOFTWARE_AVAIL_G_HW_ARCH declare -A aSOFTWARE_AVAIL_G_DISTRO @@ -286,7 +282,8 @@ _EOF_ # aSOFTWARE_CATEGORIES_LINUX then it is 1. In the example it is 0. # # - aSOFTWARE_ONLINEDOC_URL[$software_id]: - # This is appended to FP_ONLINEDOC_URL to make a URL for help on this software. + # This is appended to "https://dietpi.com/phpbb/viewtopic.php?" to make a URL for help on this software. + # This needs to be filled after creating the related online docs entry: https://dietpi.com/phpbb/viewtopic.php?p=5#p5 # # Specifying other software as dependencies: # If your software needs other software to be available, look under the 'Requires software @@ -299,33 +296,34 @@ _EOF_ # to add something like below. Look for other examples in the existing software # installations. Full list of models can be found in 'dietpi-obtain_hw_model'. # - # # - Disable for All non-RPi - # for ((i=10; i<=$MAX_G_HW_MODEL; i++)) - # do - # aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,$i]=0 - # done + # # - Disable for all non-RPi + # for ((i=10; i<=$MAX_G_HW_MODEL; i++)) + # do + # aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,$i]=0 + # done # # Example: - # #------------------ Desktops: LXDE ------------------ - # software_id=23 - # aSOFTWARE_WHIP_NAME[$software_id]='LXDE' - # aSOFTWARE_WHIP_DESC[$software_id]='ultra lightweight desktop' - # aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - # aSOFTWARE_TYPE[$software_id]=0 - # aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + # #------------------ Desktops: LXDE ------------------ + # software_id=23 + # + # aSOFTWARE_WHIP_NAME[$software_id]='LXDE' + # aSOFTWARE_WHIP_DESC[$software_id]='ultra lightweight desktop' + # aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + # aSOFTWARE_TYPE[$software_id]=0 + # aSOFTWARE_REQUIRES_ALSA[$software_id]=1 # aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - # aSOFTWARE_ONLINEDOC_URL[$software_id]='f=8&t=5#p42' + # aSOFTWARE_ONLINEDOC_URL[$software_id]='p=42#p42' # #///////////////////////////////////////////////////////////////////////////////////// Software_Arrays_Init(){ - G_DIETPI-NOTIFY -2 'Initializing database' + G_DIETPI-NOTIFY -2 'Initialising database' #-------------------------------------------------------------------------------- - #Categories - #NB: Unique IDs, do not re-arrange or re-order. + # Categories + # NB: Unique IDs, do not re-arrange or re-order! #-------------------------------------------------------------------------------- - #DietPi software + # DietPi software aSOFTWARE_CATEGORIES_DIETPI=( '●─ Desktops ' #0 @@ -352,7 +350,7 @@ _EOF_ ) - #Linux software + # Linux software aSOFTWARE_CATEGORIES_LINUX=( '●─ SSH Clients ' #0 @@ -368,87 +366,118 @@ _EOF_ ) #-------------------------------------------------------------------------------- - #DietPi software items + # DietPi software items #-------------------------------------------------------------------------------- - #Before adding, please check 'dietpi-software list | grep null' to list NULL (available) IDs for use. + # Before adding, please check 'dietpi-software free' to list free IDs for use. - #Assign UNIQUE ID to each item + # Assign unique ID to each item local software_id=-1 - #Desktops + # Desktops #-------------------------------------------------------------------------------- software_id=23 - aSOFTWARE_WHIP_NAME[$software_id]='LXDE' - aSOFTWARE_WHIP_DESC[$software_id]='ultra lightweight desktop' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=42#p42' + aSOFTWARE_WHIP_NAME[$software_id]='LXDE' + aSOFTWARE_WHIP_DESC[$software_id]='ultra lightweight desktop' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=42#p42' + + #------------------ + software_id=173 + + aSOFTWARE_WHIP_NAME[$software_id]='LXQt' + aSOFTWARE_WHIP_DESC[$software_id]='Lightweight desktop' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=17712#p17712' #------------------ software_id=24 - aSOFTWARE_WHIP_NAME[$software_id]='MATE' - aSOFTWARE_WHIP_DESC[$software_id]='desktop enviroment' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2073#p2073' + aSOFTWARE_WHIP_NAME[$software_id]='MATE' + aSOFTWARE_WHIP_DESC[$software_id]='desktop enviroment' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2073#p2073' #------------------ software_id=25 - aSOFTWARE_WHIP_NAME[$software_id]='XFCE' - aSOFTWARE_WHIP_DESC[$software_id]='lightweight desktop environment' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2203#p2203' + aSOFTWARE_WHIP_NAME[$software_id]='XFCE' + aSOFTWARE_WHIP_DESC[$software_id]='lightweight desktop environment' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2203#p2203' #------------------ software_id=26 - aSOFTWARE_WHIP_NAME[$software_id]='GNUStep' - aSOFTWARE_WHIP_DESC[$software_id]='lightweight based on OpenStep' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2072#p2072' + aSOFTWARE_WHIP_NAME[$software_id]='GNUStep' + aSOFTWARE_WHIP_DESC[$software_id]='lightweight based on OpenStep' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2072#p2072' #------------------ software_id=113 - aSOFTWARE_WHIP_NAME[$software_id]='Chromium' - aSOFTWARE_WHIP_DESC[$software_id]='web browser for desktop or autostart' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3011#p3011' + aSOFTWARE_WHIP_NAME[$software_id]='Chromium' + aSOFTWARE_WHIP_DESC[$software_id]='web browser for desktop or autostart' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3011#p3011' # - ARMv6 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,1]=0 - #Remote Desktops + #------------------ + software_id=174 + + aSOFTWARE_WHIP_NAME[$software_id]='GIMP' + aSOFTWARE_WHIP_DESC[$software_id]='mspaint on steroids' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=17713#p17713' + + #------------------ + software_id=175 + + aSOFTWARE_WHIP_NAME[$software_id]='XFCE4 Power' + aSOFTWARE_WHIP_DESC[$software_id]='power manager with brightness (recommended for LXDE/LXQt)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='' + + # Remote Desktops #-------------------------------------------------------------------------------- software_id=27 - aSOFTWARE_WHIP_NAME[$software_id]='TightVNC Server' - aSOFTWARE_WHIP_DESC[$software_id]='desktop for remote connection' - aSOFTWARE_CATEGORY_INDEX[$software_id]=1 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=408#p408' + aSOFTWARE_WHIP_NAME[$software_id]='TightVNC Server' + aSOFTWARE_WHIP_DESC[$software_id]='desktop for remote connection' + aSOFTWARE_CATEGORY_INDEX[$software_id]=1 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=408#p408' # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 - # - Stretch+: replaced by tigervnc (vnc4) + # - Stretch+: Replaced by TigerVNC (VNC4) for ((i=4; i<=$MAX_G_DISTRO; i++)) do @@ -459,42 +488,42 @@ _EOF_ #------------------ software_id=28 - aSOFTWARE_WHIP_NAME[$software_id]='VNC4 Server' - aSOFTWARE_WHIP_DESC[$software_id]='desktop for remote connection' - aSOFTWARE_CATEGORY_INDEX[$software_id]=1 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=408#p408' + aSOFTWARE_WHIP_NAME[$software_id]='VNC4 Server' + aSOFTWARE_WHIP_DESC[$software_id]='desktop for remote connection' + aSOFTWARE_CATEGORY_INDEX[$software_id]=1 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=408#p408' #------------------ software_id=29 - aSOFTWARE_WHIP_NAME[$software_id]='XRDP' - aSOFTWARE_WHIP_DESC[$software_id]='remote desktop protocol (rdp) server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=1 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2074#p2074' + aSOFTWARE_WHIP_NAME[$software_id]='XRDP' + aSOFTWARE_WHIP_DESC[$software_id]='remote desktop protocol (rdp) server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=1 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2074#p2074' #------------------ software_id=30 - aSOFTWARE_WHIP_NAME[$software_id]='NoMachine' - aSOFTWARE_WHIP_DESC[$software_id]='multi-platform server and client access' - aSOFTWARE_CATEGORY_INDEX[$software_id]=1 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2071#p2071' + aSOFTWARE_WHIP_NAME[$software_id]='NoMachine' + aSOFTWARE_WHIP_DESC[$software_id]='multi-platform server and client access' + aSOFTWARE_CATEGORY_INDEX[$software_id]=1 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2071#p2071' #------------------ software_id=120 - aSOFTWARE_WHIP_NAME[$software_id]='RealVNC Server' - aSOFTWARE_WHIP_DESC[$software_id]='desktop for remote connection' - aSOFTWARE_CATEGORY_INDEX[$software_id]=1 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4149#p4149' + aSOFTWARE_WHIP_NAME[$software_id]='RealVNC Server' + aSOFTWARE_WHIP_DESC[$software_id]='desktop for remote connection' + aSOFTWARE_CATEGORY_INDEX[$software_id]=1 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4149#p4149' # - License RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) @@ -508,243 +537,237 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=31 - aSOFTWARE_WHIP_NAME[$software_id]='Kodi' - aSOFTWARE_WHIP_DESC[$software_id]='the media centre for linux' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=43#p43' + aSOFTWARE_WHIP_NAME[$software_id]='Kodi' + aSOFTWARE_WHIP_DESC[$software_id]='the media centre for linux' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=43#p43' - # - Only RPi + Odroid - for ((i=20; i<=$MAX_G_HW_MODEL; i++)) + # - Only RPi + Odroid + x86_64 + for ((i=22; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,$i]=0 done - # - Re-enable Native PC - aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,21]=1 - # + ASUS TB aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,52]=1 # + NanoPC T4 - # aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,68]=1 + #aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,68]=1 #------------------ software_id=32 - aSOFTWARE_WHIP_NAME[$software_id]='YMPD' - aSOFTWARE_WHIP_DESC[$software_id]='lightweight web interface music player for mpd' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=50#p50' + aSOFTWARE_WHIP_NAME[$software_id]='YMPD' + aSOFTWARE_WHIP_DESC[$software_id]='lightweight web interface music player for mpd' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=50#p50' #------------------ software_id=148 - aSOFTWARE_WHIP_NAME[$software_id]='myMPD' - aSOFTWARE_WHIP_DESC[$software_id]='fork of ympd with improved features' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13978#p13978' + aSOFTWARE_WHIP_NAME[$software_id]='myMPD' + aSOFTWARE_WHIP_DESC[$software_id]='fork of ympd with improved features' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13978#p13978' #------------------ software_id=119 - aSOFTWARE_WHIP_NAME[$software_id]='CAVA' - aSOFTWARE_WHIP_DESC[$software_id]='optional: console audio vis for mpd' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3928#p3928' + aSOFTWARE_WHIP_NAME[$software_id]='CAVA' + aSOFTWARE_WHIP_DESC[$software_id]='optional: console audio vis for mpd' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3928#p3928' #------------------ software_id=33 - aSOFTWARE_WHIP_NAME[$software_id]='Airsonic' - aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 - aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=11280#p11280' + aSOFTWARE_WHIP_NAME[$software_id]='Airsonic' + aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=11280#p11280' #------------------ software_id=34 - aSOFTWARE_WHIP_NAME[$software_id]='Subsonic' - aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=213#p213' + aSOFTWARE_WHIP_NAME[$software_id]='Subsonic' + aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=213#p213' #------------------ software_id=35 - aSOFTWARE_WHIP_NAME[$software_id]='SqueezeBox' - aSOFTWARE_WHIP_DESC[$software_id]='logitech media server (lms)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1009#p1009' + aSOFTWARE_WHIP_NAME[$software_id]='Logitech Media Server' + aSOFTWARE_WHIP_DESC[$software_id]='aka LMS, Squeezebox Server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1009#p1009' #------------------ software_id=36 - aSOFTWARE_WHIP_NAME[$software_id]='SqueezeLite' - aSOFTWARE_WHIP_DESC[$software_id]='audio player for lms & squeezebox' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1009#p1009' + aSOFTWARE_WHIP_NAME[$software_id]='SqueezeLite' + aSOFTWARE_WHIP_DESC[$software_id]='audio player for lms & squeezebox' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1009#p1009' #------------------ software_id=37 - aSOFTWARE_WHIP_NAME[$software_id]='Shairport Sync' - aSOFTWARE_WHIP_DESC[$software_id]='airplay audio player with multiroom sync' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1221#p1221' + aSOFTWARE_WHIP_NAME[$software_id]='Shairport Sync' + aSOFTWARE_WHIP_DESC[$software_id]='airplay audio player with multiroom sync' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1221#p1221' #------------------ software_id=39 - aSOFTWARE_WHIP_NAME[$software_id]='ReadyMedia' - aSOFTWARE_WHIP_DESC[$software_id]='(MiniDLNA) media streaming server (dlna, upnp)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=49#p49' + aSOFTWARE_WHIP_NAME[$software_id]='ReadyMedia' + aSOFTWARE_WHIP_DESC[$software_id]='(MiniDLNA) media streaming server (dlna, upnp)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=49#p49' #------------------ software_id=40 - aSOFTWARE_WHIP_NAME[$software_id]='Ampache' - aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Ampache' + aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=554#p554' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=554#p554' #------------------ software_id=41 - aSOFTWARE_WHIP_NAME[$software_id]='Emby Server' - aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1789#p1789' + aSOFTWARE_WHIP_NAME[$software_id]='Emby Server' + aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1789#p1789' - # - Disable for ARMv6: https://github.com/MichaIng/DietPi/issues/534#issuecomment-416405968 + # - ARMv6: https://github.com/MichaIng/DietPi/issues/534#issuecomment-416405968 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,1]=0 - # - Disable for all ARM on Jessie: https://github.com/MichaIng/DietPi/issues/2521 + # - ARM on Jessie: https://github.com/MichaIng/DietPi/issues/2521 (( $G_DISTRO < 4 )) && aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,2]=0 && aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 #------------------ software_id=42 - aSOFTWARE_WHIP_NAME[$software_id]='Plex Media Server' - aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1949#p1949' + aSOFTWARE_WHIP_NAME[$software_id]='Plex Media Server' + aSOFTWARE_WHIP_DESC[$software_id]='web interface media streaming server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1949#p1949' - # - Disable for ARMv6: https://github.com/MichaIng/DietPi/issues/648 + # - ARMv6: https://github.com/MichaIng/DietPi/issues/648 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,1]=0 #------------------ software_id=43 - aSOFTWARE_WHIP_NAME[$software_id]='Murmur' - aSOFTWARE_WHIP_DESC[$software_id]='mumble voip server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1691#p1691' + aSOFTWARE_WHIP_NAME[$software_id]='Murmur' + aSOFTWARE_WHIP_DESC[$software_id]='mumble voip server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1691#p1691' #------------------ software_id=118 - aSOFTWARE_WHIP_NAME[$software_id]='Mopidy' - aSOFTWARE_WHIP_DESC[$software_id]='web interface music & radio player' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3611#p3611' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Mopidy' + aSOFTWARE_WHIP_DESC[$software_id]='web interface music & radio player' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3611#p3611' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 #------------------ software_id=121 - aSOFTWARE_WHIP_NAME[$software_id]='Roon Bridge' - aSOFTWARE_WHIP_DESC[$software_id]='Turns device into Roon capable audio player' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4153#p4153' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Roon Bridge' + aSOFTWARE_WHIP_DESC[$software_id]='Turns device into Roon capable audio player' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4153#p4153' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - # - Disable for ARMv6 + # - ARMv6 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,1]=0 #------------------ software_id=124 - aSOFTWARE_WHIP_NAME[$software_id]='NAA daemon' - aSOFTWARE_WHIP_DESC[$software_id]='signalyst network audio adaptor (naa)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4294#p4294' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='NAA daemon' + aSOFTWARE_WHIP_DESC[$software_id]='signalyst network audio adaptor (naa)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4294#p4294' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 #------------------ software_id=128 - aSOFTWARE_WHIP_NAME[$software_id]='MPD' - aSOFTWARE_WHIP_DESC[$software_id]='music player daemon' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='' + aSOFTWARE_WHIP_NAME[$software_id]='MPD' + aSOFTWARE_WHIP_DESC[$software_id]='music player daemon' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='' #------------------ software_id=129 - aSOFTWARE_WHIP_NAME[$software_id]='O!MPD' - aSOFTWARE_WHIP_DESC[$software_id]='feature-rich, web interface audio player for mpd' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=5171#p5171' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='O!MPD' + aSOFTWARE_WHIP_DESC[$software_id]='feature-rich, web interface audio player for mpd' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=5171#p5171' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - - # - VM - aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,20]=0 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 #------------------ software_id=135 - aSOFTWARE_WHIP_NAME[$software_id]='IceCast' - aSOFTWARE_WHIP_DESC[$software_id]='Shoutcast streaming server (+DarkIce)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6526#p6526' + aSOFTWARE_WHIP_NAME[$software_id]='IceCast' + aSOFTWARE_WHIP_DESC[$software_id]='Shoutcast streaming server (+DarkIce)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6526#p6526' # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,20]=0 @@ -752,12 +775,12 @@ _EOF_ #------------------ software_id=141 - aSOFTWARE_WHIP_NAME[$software_id]='Spotify Connect Web' - aSOFTWARE_WHIP_DESC[$software_id]='web interface for spotify premium' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7013#p7013' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Spotify Connect Web' + aSOFTWARE_WHIP_DESC[$software_id]='web interface for spotify premium' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7013#p7013' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 # - Currently ARMv7+ only, so disable all archs, then re-enable armv7+ for ((i=1; i<=$MAX_G_HW_ARCH; i++)) @@ -771,39 +794,39 @@ _EOF_ #------------------ software_id=143 - aSOFTWARE_WHIP_NAME[$software_id]='Koel' - aSOFTWARE_WHIP_DESC[$software_id]='web interface audio streamer' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7305#p7305' + aSOFTWARE_WHIP_NAME[$software_id]='Koel' + aSOFTWARE_WHIP_DESC[$software_id]='web interface audio streamer' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7305#p7305' aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 # Currently user prompt asks for admin user credentials: aSOFTWARE_REQUIRES_USERINPUT[$software_id]=1 #------------------ software_id=146 - aSOFTWARE_WHIP_NAME[$software_id]='Tautulli' - aSOFTWARE_WHIP_DESC[$software_id]='monitoring and tracking tool for Plex' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7463#p7463' - aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Tautulli' + aSOFTWARE_WHIP_DESC[$software_id]='monitoring and tracking tool for Plex' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7463#p7463' + aSOFTWARE_REQUIRES_GIT[$software_id]=1 #------------------ software_id=154 - aSOFTWARE_WHIP_NAME[$software_id]='Roon Server' - aSOFTWARE_WHIP_DESC[$software_id]='Roon capable audio player and core' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7966#p7966' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Roon Server' + aSOFTWARE_WHIP_DESC[$software_id]='Roon capable audio player and core' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7966#p7966' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 # - x86_64 only for ((i=1; i<=$MAX_G_HW_ARCH; i++)) @@ -817,282 +840,284 @@ _EOF_ #------------------ software_id=159 - aSOFTWARE_WHIP_NAME[$software_id]='Allo' - aSOFTWARE_WHIP_DESC[$software_id]='web interface' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Allo' + aSOFTWARE_WHIP_DESC[$software_id]='web interface' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 #------------------ software_id=160 - aSOFTWARE_WHIP_NAME[$software_id]='Allo_update' - aSOFTWARE_WHIP_DESC[$software_id]='quick reinstall/update web only' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='' + aSOFTWARE_WHIP_NAME[$software_id]='Allo_update' + aSOFTWARE_WHIP_DESC[$software_id]='quick reinstall/update web only' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='' #------------------ software_id=163 - aSOFTWARE_WHIP_NAME[$software_id]='GMediaRender' - aSOFTWARE_WHIP_DESC[$software_id]='DLNA audio render/endpoint' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9012#p9012' + aSOFTWARE_WHIP_NAME[$software_id]='GMediaRender' + aSOFTWARE_WHIP_DESC[$software_id]='DLNA audio render/endpoint' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9012#p9012' #------------------ software_id=167 - aSOFTWARE_WHIP_NAME[$software_id]='Raspotify' - aSOFTWARE_WHIP_DESC[$software_id]='spotify connect client' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9368#p9368' + aSOFTWARE_WHIP_NAME[$software_id]='Raspotify' + aSOFTWARE_WHIP_DESC[$software_id]='spotify connect client' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9368#p9368' - # Disable for ARMv8 + x86_64: + # - ARMv8 - x86_64 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,10]=0 #------------------ software_id=80 - aSOFTWARE_WHIP_NAME[$software_id]='Ubooquity' - aSOFTWARE_WHIP_DESC[$software_id]='a free home server for your comics and ebooks library' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=12969#p12969' + aSOFTWARE_WHIP_NAME[$software_id]='Ubooquity' + aSOFTWARE_WHIP_DESC[$software_id]='a free home server for your comics and ebooks library' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=12969#p12969' #------------------ software_id=86 - aSOFTWARE_WHIP_NAME[$software_id]='Roon Extension Manager' - aSOFTWARE_WHIP_DESC[$software_id]='Manage extensions from within Roon' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13160#p13160' + aSOFTWARE_WHIP_NAME[$software_id]='Roon Extension Manager' + aSOFTWARE_WHIP_DESC[$software_id]='Manage extensions from within Roon' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13160#p13160' #BitTorrent #-------------------------------------------------------------------------------- software_id=44 - aSOFTWARE_WHIP_NAME[$software_id]='Transmission' - aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with web interface (c)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=46#p46' + aSOFTWARE_WHIP_NAME[$software_id]='Transmission' + aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with web interface (c)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=46#p46' #------------------ software_id=45 - aSOFTWARE_WHIP_NAME[$software_id]='Deluge' - aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with web interface (python)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=61#p61' + aSOFTWARE_WHIP_NAME[$software_id]='Deluge' + aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with web interface (python)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=61#p61' #------------------ software_id=46 - aSOFTWARE_WHIP_NAME[$software_id]='qBitTorrent' - aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with web interface (c++)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2272#p2272' + aSOFTWARE_WHIP_NAME[$software_id]='qBitTorrent' + aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with web interface (c++)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2272#p2272' #------------------ software_id=107 - aSOFTWARE_WHIP_NAME[$software_id]='rTorrent' - aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with rutorrent web interface' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='rTorrent' + aSOFTWARE_WHIP_DESC[$software_id]='bittorrent server with rutorrent web interface' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2603#p2603' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2603#p2603' #------------------ software_id=116 - aSOFTWARE_WHIP_NAME[$software_id]='Medusa' - aSOFTWARE_WHIP_DESC[$software_id]='Automatic Video Library Manager for TV Shows' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3327#p3327' + aSOFTWARE_WHIP_NAME[$software_id]='Medusa' + aSOFTWARE_WHIP_DESC[$software_id]='Automatic Video Library Manager for TV Shows' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3327#p3327' #------------------ software_id=132 - aSOFTWARE_WHIP_NAME[$software_id]='Aria2' - aSOFTWARE_WHIP_DESC[$software_id]='download manager with web interface' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6177#p6177' + aSOFTWARE_WHIP_NAME[$software_id]='Aria2' + aSOFTWARE_WHIP_DESC[$software_id]='download manager with web interface' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6177#p6177' aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 #------------------ software_id=139 - aSOFTWARE_WHIP_NAME[$software_id]='SABnzbd' - aSOFTWARE_WHIP_DESC[$software_id]='nzb download manager' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6747#p6747' - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='SABnzbd' + aSOFTWARE_WHIP_DESC[$software_id]='nzb download manager' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6747#p6747' + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 #------------------ software_id=142 - aSOFTWARE_WHIP_NAME[$software_id]='CouchPotato' - aSOFTWARE_WHIP_DESC[$software_id]='automatically download movies' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6747#p6747' - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='CouchPotato' + aSOFTWARE_WHIP_DESC[$software_id]='automatically download movies' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6747#p6747' + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 #------------------ software_id=144 - aSOFTWARE_WHIP_NAME[$software_id]='Sonarr' - aSOFTWARE_WHIP_DESC[$software_id]='automatically download TV shows' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7455#p7455' - aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Sonarr' + aSOFTWARE_WHIP_DESC[$software_id]='automatically download TV shows' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7455#p7455' + aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 #------------------ software_id=145 - aSOFTWARE_WHIP_NAME[$software_id]='Radarr' - aSOFTWARE_WHIP_DESC[$software_id]='automatically download movies' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7457#p7457' - aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Radarr' + aSOFTWARE_WHIP_DESC[$software_id]='automatically download movies' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7457#p7457' + aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 #------------------ software_id=106 - aSOFTWARE_WHIP_NAME[$software_id]='Lidarr' - aSOFTWARE_WHIP_DESC[$software_id]='automatically download music' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13580#p13580' - aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Lidarr' + aSOFTWARE_WHIP_DESC[$software_id]='automatically download music' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13580#p13580' + aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 #------------------ software_id=147 - aSOFTWARE_WHIP_NAME[$software_id]='Jackett' - aSOFTWARE_WHIP_DESC[$software_id]='API support for your torrent trackers' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7503#p7503' + aSOFTWARE_WHIP_NAME[$software_id]='Jackett' + aSOFTWARE_WHIP_DESC[$software_id]='API support for your torrent trackers' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7503#p7503' #------------------ software_id=149 - aSOFTWARE_WHIP_NAME[$software_id]='NZBget' - aSOFTWARE_WHIP_DESC[$software_id]='nzb download manager' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7575#p7575' + aSOFTWARE_WHIP_NAME[$software_id]='NZBget' + aSOFTWARE_WHIP_DESC[$software_id]='nzb download manager' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7575#p7575' #------------------ BitTorrent: HTPC Manager ------------------ software_id=155 - aSOFTWARE_WHIP_NAME[$software_id]='HTPC Manager' - aSOFTWARE_WHIP_DESC[$software_id]='manage your HTPC from anywhere' - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=8043#p8043' + aSOFTWARE_WHIP_NAME[$software_id]='HTPC Manager' + aSOFTWARE_WHIP_DESC[$software_id]='manage your HTPC from anywhere' + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=8043#p8043' #Cloud / Backups #-------------------------------------------------------------------------------- software_id=47 - aSOFTWARE_WHIP_NAME[$software_id]='ownCloud' - aSOFTWARE_WHIP_DESC[$software_id]='File sync, sharing and collaboration platform' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='ownCloud' + aSOFTWARE_WHIP_DESC[$software_id]='File sync, sharing and collaboration platform' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=47#p47' - # Current ownCloud 10.0.10 does not support PHP7.3 (Buster): https://doc.owncloud.org/server/administration_manual/installation/system_requirements.html - aSOFTWARE_AVAIL_G_DISTRO[$software_id,5]=0 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=47#p47' + # ownCloud up to 10.2 does not support PHP7.3 (Buster): https://doc.owncloud.org/server/administration_manual/installation/system_requirements.html + aSOFTWARE_AVAIL_G_DISTRO[$software_id,5]=0 + # Disable if PHP7.3 is already installed + command -v php7.3 &> /dev/null && aSOFTWARE_AVAIL_G_DISTRO[$software_id,$G_DISTRO]=0 #------------------ software_id=114 - aSOFTWARE_WHIP_NAME[$software_id]='Nextcloud' - aSOFTWARE_WHIP_DESC[$software_id]='File sync, sharing and collaboration platform' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='Nextcloud' + aSOFTWARE_WHIP_DESC[$software_id]='File sync, sharing and collaboration platform' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3026#p3026' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3026#p3026' #------------------ software_id=168 - aSOFTWARE_WHIP_NAME[$software_id]='Nextcloud Talk' - aSOFTWARE_WHIP_DESC[$software_id]='Video calls with configured TURN server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 - #Currently requires manual domain and TURN server port input. + aSOFTWARE_WHIP_NAME[$software_id]='Nextcloud Talk' + aSOFTWARE_WHIP_DESC[$software_id]='Video calls with configured coTURN server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 + # Currently requires manual domain and coTURN server port input. # - To resolve: Default port 5349 could be used, but reliable method to get external domain/static IP is required. aSOFTWARE_REQUIRES_USERINPUT[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=15227#p15227' + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=15227#p15227' #------------------ software_id=48 - aSOFTWARE_WHIP_NAME[$software_id]='Pydio' - aSOFTWARE_WHIP_DESC[$software_id]='feature-rich backup and sync server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='Pydio' + aSOFTWARE_WHIP_DESC[$software_id]='feature-rich backup and sync server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1064#p1064' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1064#p1064' #------------------ software_id=111 - aSOFTWARE_WHIP_NAME[$software_id]='UrBackup server' - aSOFTWARE_WHIP_DESC[$software_id]='full system backup server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=65#p65' + aSOFTWARE_WHIP_NAME[$software_id]='UrBackup server' + aSOFTWARE_WHIP_DESC[$software_id]='full system backup server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=65#p65' - # No deb packages for ARMv6: + # - ARMv6: aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,1]=0 #------------------ software_id=49 - aSOFTWARE_WHIP_NAME[$software_id]='Gogs' - aSOFTWARE_WHIP_DESC[$software_id]='personal github server with web interface' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2187#p2187' + aSOFTWARE_WHIP_NAME[$software_id]='Gogs' + aSOFTWARE_WHIP_DESC[$software_id]='personal github server with web interface' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2187#p2187' # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 @@ -1100,20 +1125,20 @@ _EOF_ #------------------ software_id=50 - aSOFTWARE_WHIP_NAME[$software_id]='Syncthing' - aSOFTWARE_WHIP_DESC[$software_id]='backup and sync server with web interface' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2363#p2363' + aSOFTWARE_WHIP_NAME[$software_id]='Syncthing' + aSOFTWARE_WHIP_DESC[$software_id]='backup and sync server with web interface' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2363#p2363' #------------------ software_id=134 - aSOFTWARE_WHIP_NAME[$software_id]='Tonido' - aSOFTWARE_WHIP_DESC[$software_id]='lightweight cloud based backup system' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6476#p6476' + aSOFTWARE_WHIP_NAME[$software_id]='Tonido' + aSOFTWARE_WHIP_DESC[$software_id]='lightweight cloud based backup system' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6476#p6476' # - ARMv6 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,1]=0 @@ -1123,17 +1148,19 @@ _EOF_ #------------------ software_id=158 - aSOFTWARE_WHIP_NAME[$software_id]='Minio' - aSOFTWARE_WHIP_DESC[$software_id]='S3 compatible distributed object server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 + + aSOFTWARE_WHIP_NAME[$software_id]='Minio' + aSOFTWARE_WHIP_DESC[$software_id]='S3 compatible distributed object server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 #------------------ software_id=161 - aSOFTWARE_WHIP_NAME[$software_id]='FuguHub' - aSOFTWARE_WHIP_DESC[$software_id]='Lightweight WebDAV cloud (eg: dropbox) with a CMS' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 + + aSOFTWARE_WHIP_NAME[$software_id]='FuguHub' + aSOFTWARE_WHIP_DESC[$software_id]='Lightweight WebDAV cloud (eg: dropbox) with a CMS' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 @@ -1141,35 +1168,34 @@ _EOF_ #------------------ software_id=165 - aSOFTWARE_WHIP_NAME[$software_id]='Gitea' - aSOFTWARE_WHIP_DESC[$software_id]='Git with a cup of tea' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9863#p9863' - + aSOFTWARE_WHIP_NAME[$software_id]='Gitea' + aSOFTWARE_WHIP_DESC[$software_id]='Git with a cup of tea' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9863#p9863' #Emulation / Gaming #-------------------------------------------------------------------------------- software_id=108 - aSOFTWARE_WHIP_NAME[$software_id]='AmiBerry' - aSOFTWARE_WHIP_DESC[$software_id]='amiga emulator' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=64#p64' - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='AmiBerry' + aSOFTWARE_WHIP_DESC[$software_id]='amiga emulator' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=64#p64' + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,$i]=0 done - aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,52]=1 # ASUS TB + aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,52]=1 # + ASUS TB # - XU4 test #aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,11]=1 #Requires Stretch due to libc requirements @@ -1177,15 +1203,15 @@ _EOF_ #------------------ software_id=51 - aSOFTWARE_WHIP_NAME[$software_id]='OpenTyrian' - aSOFTWARE_WHIP_DESC[$software_id]='a classic retro game, addictive' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=45#p45' + aSOFTWARE_WHIP_NAME[$software_id]='OpenTyrian' + aSOFTWARE_WHIP_DESC[$software_id]='a classic retro game, addictive' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=45#p45' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1193,17 +1219,21 @@ _EOF_ done + # - enable x86_64 + aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,21]=1 + + #------------------ software_id=112 - aSOFTWARE_WHIP_NAME[$software_id]='DXX-Rebirth' - aSOFTWARE_WHIP_DESC[$software_id]='Descent 1/2' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2963#p2963' + aSOFTWARE_WHIP_NAME[$software_id]='DXX-Rebirth' + aSOFTWARE_WHIP_DESC[$software_id]='Descent 1/2' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2963#p2963' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1214,11 +1244,11 @@ _EOF_ #------------------ software_id=52 - aSOFTWARE_WHIP_NAME[$software_id]='Cuberite' - aSOFTWARE_WHIP_DESC[$software_id]='minecraft server with web interface (c++)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2068#p2068' + aSOFTWARE_WHIP_NAME[$software_id]='Cuberite' + aSOFTWARE_WHIP_DESC[$software_id]='minecraft server with web interface (c++)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2068#p2068' # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 @@ -1226,29 +1256,29 @@ _EOF_ #------------------ software_id=53 - aSOFTWARE_WHIP_NAME[$software_id]='MineOS' - aSOFTWARE_WHIP_DESC[$software_id]='minecraft servers with web interface (java)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 - aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2069#p2069' + aSOFTWARE_WHIP_NAME[$software_id]='MineOS' + aSOFTWARE_WHIP_DESC[$software_id]='minecraft servers with web interface (java)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2069#p2069' #------------------ software_id=156 - aSOFTWARE_WHIP_NAME[$software_id]='Steam' - aSOFTWARE_WHIP_DESC[$software_id]='client' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=8016#p8016' - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Steam' + aSOFTWARE_WHIP_DESC[$software_id]='client' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=8016#p8016' + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 - #Native PC only + # Native PC only for ((i=0; i<=$MAX_G_HW_MODEL; i++)) do @@ -1259,94 +1289,95 @@ _EOF_ #------------------ software_id=164 - aSOFTWARE_WHIP_NAME[$software_id]='Nukkit' - aSOFTWARE_WHIP_DESC[$software_id]='A nuclear-powered server for Minecraft Pocket Edition' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=10675#p10675' + + aSOFTWARE_WHIP_NAME[$software_id]='Nukkit' + aSOFTWARE_WHIP_DESC[$software_id]='A nuclear-powered server for Minecraft Pocket Edition' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=10675#p10675' #Social Media #-------------------------------------------------------------------------------- software_id=54 - aSOFTWARE_WHIP_NAME[$software_id]='Forums' - aSOFTWARE_WHIP_DESC[$software_id]='phpbb forums' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='phpBB' + aSOFTWARE_WHIP_DESC[$software_id]='bulletin board forum software' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=51#p51' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=51#p51' #------------------ software_id=55 - aSOFTWARE_WHIP_NAME[$software_id]='Wordpress' - aSOFTWARE_WHIP_DESC[$software_id]='website blog and publishing platform' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='Wordpress' + aSOFTWARE_WHIP_DESC[$software_id]='website blog and publishing platform' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=395#p395' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=395#p395' #------------------ software_id=38 - aSOFTWARE_WHIP_NAME[$software_id]='FreshRSS' - aSOFTWARE_WHIP_DESC[$software_id]='self-hosted RSS feed aggregator' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='FreshRSS' + aSOFTWARE_WHIP_DESC[$software_id]='self-hosted RSS feed aggregator' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13918#p13918' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13918#p13918' #------------------ software_id=56 - aSOFTWARE_WHIP_NAME[$software_id]='Image Gallery' - aSOFTWARE_WHIP_DESC[$software_id]='website to host / browse your images' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='Image Gallery' + aSOFTWARE_WHIP_DESC[$software_id]='website to host / browse your images' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=480#p480' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=480#p480' #------------------ software_id=57 - aSOFTWARE_WHIP_NAME[$software_id]='BaiKal' - aSOFTWARE_WHIP_DESC[$software_id]='lightweight caldav + carddav server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='BaiKal' + aSOFTWARE_WHIP_DESC[$software_id]='lightweight caldav + carddav server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1502#p1502' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1502#p1502' #------------------ software_id=58 - aSOFTWARE_WHIP_NAME[$software_id]='OpenBazaar' - aSOFTWARE_WHIP_DESC[$software_id]='decentralized peer to peer bitcoin market' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_REQUIRES_USERINPUT[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1796#p1796' + aSOFTWARE_WHIP_NAME[$software_id]='OpenBazaar' + aSOFTWARE_WHIP_DESC[$software_id]='decentralized peer to peer bitcoin market' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_REQUIRES_USERINPUT[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1796#p1796' #------------------ software_id=133 - aSOFTWARE_WHIP_NAME[$software_id]='YaCy' - aSOFTWARE_WHIP_DESC[$software_id]='decentralized open source search engine' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6202#p6202' + aSOFTWARE_WHIP_NAME[$software_id]='YaCy' + aSOFTWARE_WHIP_DESC[$software_id]='decentralized open source search engine' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6202#p6202' #------------------ software_id=2 @@ -1356,6 +1387,7 @@ _EOF_ aSOFTWARE_CATEGORY_INDEX[$software_id]=20 aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_ONLINEDOC_URL[$software_id]='p=13704#p13704' + # - x86_64 only for ((i=1; i<$MAX_G_HW_ARCH; i++)) do @@ -1363,7 +1395,8 @@ _EOF_ aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,$i]=0 done - # - Not supported on Jessie: https://github.com/MichaIng/DietPi/pull/1992#issuecomment-410772255 + + # - Jessie: https://github.com/MichaIng/DietPi/pull/1992#issuecomment-410772255 aSOFTWARE_AVAIL_G_DISTRO[$software_id,3]=0 #------------------ @@ -1372,15 +1405,15 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=59 - aSOFTWARE_WHIP_NAME[$software_id]='RPi Cam Control' - aSOFTWARE_WHIP_DESC[$software_id]='web interface & controls for your rpi camera' - aSOFTWARE_CATEGORY_INDEX[$software_id]=7 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='RPi Cam Control' + aSOFTWARE_WHIP_DESC[$software_id]='web interface & controls for your rpi camera' + aSOFTWARE_CATEGORY_INDEX[$software_id]=7 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=48#p48' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=48#p48' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1391,20 +1424,16 @@ _EOF_ #------------------ software_id=136 - aSOFTWARE_WHIP_NAME[$software_id]='MotionEye' - aSOFTWARE_WHIP_DESC[$software_id]='web interface & surveillance for your camera' - aSOFTWARE_CATEGORY_INDEX[$software_id]=7 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6610#p6610' - aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - - # - Disable for Jessie - if (( $G_DISTRO == 3 )); then - - aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,$G_HW_MODEL]=0 + aSOFTWARE_WHIP_NAME[$software_id]='MotionEye' + aSOFTWARE_WHIP_DESC[$software_id]='web interface & surveillance for your camera' + aSOFTWARE_CATEGORY_INDEX[$software_id]=7 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6610#p6610' + aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - fi + # - Jessie + aSOFTWARE_AVAIL_G_DISTRO[$software_id,3]=0 #------------------ @@ -1412,11 +1441,11 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=60 - aSOFTWARE_WHIP_NAME[$software_id]='WiFi Hotspot' - aSOFTWARE_WHIP_DESC[$software_id]='turn your device into a wifi hotspot' - aSOFTWARE_CATEGORY_INDEX[$software_id]=8 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1207#p1207' + aSOFTWARE_WHIP_NAME[$software_id]='WiFi Hotspot' + aSOFTWARE_WHIP_DESC[$software_id]='turn your device into a wifi hotspot' + aSOFTWARE_CATEGORY_INDEX[$software_id]=8 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1207#p1207' # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,20]=0 @@ -1424,11 +1453,11 @@ _EOF_ #------------------ software_id=61 - aSOFTWARE_WHIP_NAME[$software_id]='Tor Hotspot' - aSOFTWARE_WHIP_DESC[$software_id]='optional: route hotspot traffic through tor' - aSOFTWARE_CATEGORY_INDEX[$software_id]=8 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1529#p1529' + aSOFTWARE_WHIP_NAME[$software_id]='Tor Hotspot' + aSOFTWARE_WHIP_DESC[$software_id]='optional: route hotspot traffic through tor' + aSOFTWARE_CATEGORY_INDEX[$software_id]=8 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1529#p1529' # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,20]=0 @@ -1439,55 +1468,55 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=62 - aSOFTWARE_WHIP_NAME[$software_id]='DietPi-Cloudshell' - aSOFTWARE_WHIP_DESC[$software_id]='system stats displayed on lcd/panel' - aSOFTWARE_CATEGORY_INDEX[$software_id]=9 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=204#p204' + aSOFTWARE_WHIP_NAME[$software_id]='DietPi-Cloudshell' + aSOFTWARE_WHIP_DESC[$software_id]='system stats displayed on lcd/panel' + aSOFTWARE_CATEGORY_INDEX[$software_id]=9 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=204#p204' #------------------ software_id=63 - aSOFTWARE_WHIP_NAME[$software_id]='LinuxDash' - aSOFTWARE_WHIP_DESC[$software_id]='web interface system stats' - aSOFTWARE_CATEGORY_INDEX[$software_id]=9 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='LinuxDash' + aSOFTWARE_WHIP_DESC[$software_id]='web interface system stats' + aSOFTWARE_CATEGORY_INDEX[$software_id]=9 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=108#p108' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=108#p108' #------------------ software_id=64 - aSOFTWARE_WHIP_NAME[$software_id]='PhpSysInfo' - aSOFTWARE_WHIP_DESC[$software_id]='web interface system stats' - aSOFTWARE_CATEGORY_INDEX[$software_id]=9 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='PhpSysInfo' + aSOFTWARE_WHIP_DESC[$software_id]='web interface system stats' + aSOFTWARE_CATEGORY_INDEX[$software_id]=9 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=451#p451' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=451#p451' #------------------ software_id=65 - aSOFTWARE_WHIP_NAME[$software_id]='NetData' - aSOFTWARE_WHIP_DESC[$software_id]='real-time performance monitoring' - aSOFTWARE_CATEGORY_INDEX[$software_id]=9 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='NetData' + aSOFTWARE_WHIP_DESC[$software_id]='real-time performance monitoring' + aSOFTWARE_CATEGORY_INDEX[$software_id]=9 + aSOFTWARE_TYPE[$software_id]=0 # Node.js only required for our custom package (( $G_DISTRO < 4 || ( $G_HW_MODEL < 10 && $G_DISTRO < 5 ) )) && aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1611#p1611' + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1611#p1611' #------------------ software_id=66 - aSOFTWARE_WHIP_NAME[$software_id]='RPi-Monitor' - aSOFTWARE_WHIP_DESC[$software_id]='web interface system stats' - aSOFTWARE_CATEGORY_INDEX[$software_id]=9 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1503#p1503' + aSOFTWARE_WHIP_NAME[$software_id]='RPi-Monitor' + aSOFTWARE_WHIP_DESC[$software_id]='web interface system stats' + aSOFTWARE_CATEGORY_INDEX[$software_id]=9 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1503#p1503' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1498,49 +1527,48 @@ _EOF_ #------------------ software_id=115 - aSOFTWARE_WHIP_NAME[$software_id]='Webmin' - aSOFTWARE_WHIP_DESC[$software_id]='web interface system management' - aSOFTWARE_CATEGORY_INDEX[$software_id]=9 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3047#p3047' - aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Webmin' + aSOFTWARE_WHIP_DESC[$software_id]='web interface system management' + aSOFTWARE_CATEGORY_INDEX[$software_id]=9 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3047#p3047' + aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 #------------------ software_id=162 - aSOFTWARE_WHIP_NAME[$software_id]='Docker' - aSOFTWARE_WHIP_DESC[$software_id]='Build, ship, and run distributed applications' - aSOFTWARE_CATEGORY_INDEX[$software_id]=9 - aSOFTWARE_TYPE[$software_id]=0 - + aSOFTWARE_WHIP_NAME[$software_id]='Docker' + aSOFTWARE_WHIP_DESC[$software_id]='Build, ship, and run distributed applications' + aSOFTWARE_CATEGORY_INDEX[$software_id]=9 + aSOFTWARE_TYPE[$software_id]=0 #Remote Access #-------------------------------------------------------------------------------- software_id=67 - aSOFTWARE_WHIP_NAME[$software_id]='NoIp' - aSOFTWARE_WHIP_DESC[$software_id]='url website address for your device' - aSOFTWARE_CATEGORY_INDEX[$software_id]=10 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=58#p58' + aSOFTWARE_WHIP_NAME[$software_id]='NoIp' + aSOFTWARE_WHIP_DESC[$software_id]='url website address for your device' + aSOFTWARE_CATEGORY_INDEX[$software_id]=10 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=58#p58' #------------------ software_id=68 - aSOFTWARE_WHIP_NAME[$software_id]='Remot3.it' - aSOFTWARE_WHIP_DESC[$software_id]='(Weaved) access your device over the internet' - aSOFTWARE_CATEGORY_INDEX[$software_id]=10 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=188#p188' + aSOFTWARE_WHIP_NAME[$software_id]='Remot3.it' + aSOFTWARE_WHIP_DESC[$software_id]='(Weaved) access your device over the internet' + aSOFTWARE_CATEGORY_INDEX[$software_id]=10 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=188#p188' #------------------ software_id=138 - aSOFTWARE_WHIP_NAME[$software_id]='VirtualHere' - aSOFTWARE_WHIP_DESC[$software_id]='server: share USB devices over the network' - aSOFTWARE_CATEGORY_INDEX[$software_id]=10 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6709#p6709' + aSOFTWARE_WHIP_NAME[$software_id]='VirtualHere' + aSOFTWARE_WHIP_DESC[$software_id]='server: share USB devices over the network' + aSOFTWARE_CATEGORY_INDEX[$software_id]=10 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6709#p6709' #------------------ @@ -1548,13 +1576,13 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=69 - aSOFTWARE_WHIP_NAME[$software_id]='RPi.GPIO' - aSOFTWARE_WHIP_DESC[$software_id]='gpio interface library for rpi (python)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1065#p1065' + aSOFTWARE_WHIP_NAME[$software_id]='RPi.GPIO' + aSOFTWARE_WHIP_DESC[$software_id]='gpio interface library for rpi (python)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1065#p1065' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1565,14 +1593,14 @@ _EOF_ #------------------ software_id=70 - aSOFTWARE_WHIP_NAME[$software_id]='WiringPi' - aSOFTWARE_WHIP_DESC[$software_id]='gpio interface library (c)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1066#p1066' + aSOFTWARE_WHIP_NAME[$software_id]='WiringPi' + aSOFTWARE_WHIP_DESC[$software_id]='gpio interface library (c)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1066#p1066' - # - RPi / Odroids + # - RPi + Odroids only for ((i=20; i<=$MAX_G_HW_MODEL; i++)) do @@ -1580,20 +1608,20 @@ _EOF_ done - #+ BPi Pro + # + BPi Pro aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,51]=1 #------------------ software_id=71 - aSOFTWARE_WHIP_NAME[$software_id]='WebIOPi' - aSOFTWARE_WHIP_DESC[$software_id]='web interface to control rpi.gpio' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=189#p189' + aSOFTWARE_WHIP_NAME[$software_id]='WebIOPi' + aSOFTWARE_WHIP_DESC[$software_id]='web interface to control rpi.gpio' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=189#p189' - # - Disable for All non-RPi and RPi3 + # - RPi1/2/Zero only for ((i=3; i<=$MAX_G_HW_MODEL; i++)) do @@ -1604,12 +1632,12 @@ _EOF_ #------------------ software_id=72 - aSOFTWARE_WHIP_NAME[$software_id]='I2c' - aSOFTWARE_WHIP_DESC[$software_id]='enables support for i2c based hardware' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='I2C' + aSOFTWARE_WHIP_DESC[$software_id]='enables support for i2c based hardware' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1620,13 +1648,13 @@ _EOF_ #------------------ software_id=100 - aSOFTWARE_WHIP_NAME[$software_id]='PiJuice' - aSOFTWARE_WHIP_DESC[$software_id]='pisupply ups' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=10740#p10740' + aSOFTWARE_WHIP_NAME[$software_id]='PiJuice' + aSOFTWARE_WHIP_DESC[$software_id]='pisupply ups' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=10740#p10740' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1637,45 +1665,45 @@ _EOF_ #------------------ software_id=122 - aSOFTWARE_WHIP_NAME[$software_id]='Node-Red' - aSOFTWARE_WHIP_DESC[$software_id]='tool for wiring devices, APIs and online services' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4292#p4292' + aSOFTWARE_WHIP_NAME[$software_id]='Node-Red' + aSOFTWARE_WHIP_DESC[$software_id]='tool for wiring devices, APIs and online services' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4292#p4292' #------------------ software_id=123 - aSOFTWARE_WHIP_NAME[$software_id]='Mosquitto ' - aSOFTWARE_WHIP_DESC[$software_id]='MQTT messaging broker' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4293#p4293' + aSOFTWARE_WHIP_NAME[$software_id]='Mosquitto ' + aSOFTWARE_WHIP_DESC[$software_id]='MQTT messaging broker' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4293#p4293' #------------------ software_id=131 - aSOFTWARE_WHIP_NAME[$software_id]='Blynk Server' - aSOFTWARE_WHIP_DESC[$software_id]='msg controller for blynk mobile app and sbcs' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=5901#p5901' - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 - aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Blynk Server' + aSOFTWARE_WHIP_DESC[$software_id]='msg controller for blynk mobile app and sbcs' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=5901#p5901' + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_REQUIRES_NODEJS[$software_id]=1 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 #------------------ software_id=166 - aSOFTWARE_WHIP_NAME[$software_id]='PI-SPC' - aSOFTWARE_WHIP_DESC[$software_id]='audiophonics pi-spc power control module' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9359#p9359' + aSOFTWARE_WHIP_NAME[$software_id]='PI-SPC' + aSOFTWARE_WHIP_DESC[$software_id]='audiophonics pi-spc power control module' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9359#p9359' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1686,15 +1714,15 @@ _EOF_ #------------------ software_id=169 - aSOFTWARE_WHIP_NAME[$software_id]='Google AIY' - aSOFTWARE_WHIP_DESC[$software_id]='voice kit' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_ALSA[$software_id]=1 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9486#p9486' + aSOFTWARE_WHIP_NAME[$software_id]='Google AIY' + aSOFTWARE_WHIP_DESC[$software_id]='voice kit' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_ALSA[$software_id]=1 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=9486#p9486' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -1705,235 +1733,234 @@ _EOF_ #------------------ software_id=74 - aSOFTWARE_WHIP_NAME[$software_id]='InfluxDB' - aSOFTWARE_WHIP_DESC[$software_id]='time-series database' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=12523#p12523' + aSOFTWARE_WHIP_NAME[$software_id]='InfluxDB' + aSOFTWARE_WHIP_DESC[$software_id]='time-series database' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=12523#p12523' #------------------ software_id=77 - aSOFTWARE_WHIP_NAME[$software_id]='Grafana' - aSOFTWARE_WHIP_DESC[$software_id]='platform for analytics and monitoring' - aSOFTWARE_CATEGORY_INDEX[$software_id]=11 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=12524#p12524' - + aSOFTWARE_WHIP_NAME[$software_id]='Grafana' + aSOFTWARE_WHIP_DESC[$software_id]='platform for analytics and monitoring' + aSOFTWARE_CATEGORY_INDEX[$software_id]=11 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=12524#p12524' #System security #-------------------------------------------------------------------------------- software_id=73 - aSOFTWARE_WHIP_NAME[$software_id]='Fail2Ban' - aSOFTWARE_WHIP_DESC[$software_id]='prevents brute-force attacks with ip ban' - aSOFTWARE_CATEGORY_INDEX[$software_id]=12 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=452#p452' + aSOFTWARE_WHIP_NAME[$software_id]='Fail2Ban' + aSOFTWARE_WHIP_DESC[$software_id]='prevents brute-force attacks with ip ban' + aSOFTWARE_CATEGORY_INDEX[$software_id]=12 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=452#p452' #------------------ #Webserver stacks #-------------------------------------------------------------------------------- software_id=75 - aSOFTWARE_WHIP_NAME[$software_id]='LASP' - aSOFTWARE_WHIP_DESC[$software_id]='apache2 | sqlite | php' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=52#p52' + aSOFTWARE_WHIP_NAME[$software_id]='LASP' + aSOFTWARE_WHIP_DESC[$software_id]='apache2 | sqlite | php' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=52#p52' #------------------ software_id=76 - aSOFTWARE_WHIP_NAME[$software_id]='LAMP' - aSOFTWARE_WHIP_DESC[$software_id]='apache2 | mariadb | php' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=52#p52' + aSOFTWARE_WHIP_NAME[$software_id]='LAMP' + aSOFTWARE_WHIP_DESC[$software_id]='apache2 | mariadb | php' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=52#p52' #------------------ software_id=78 - aSOFTWARE_WHIP_NAME[$software_id]='LESP' - aSOFTWARE_WHIP_DESC[$software_id]='nginx | sqlite | php' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=53#p53' + aSOFTWARE_WHIP_NAME[$software_id]='LESP' + aSOFTWARE_WHIP_DESC[$software_id]='nginx | sqlite | php' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=53#p53' #------------------ software_id=79 - aSOFTWARE_WHIP_NAME[$software_id]='LEMP' - aSOFTWARE_WHIP_DESC[$software_id]='nginx | mariadb | php' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=53#p53' + aSOFTWARE_WHIP_NAME[$software_id]='LEMP' + aSOFTWARE_WHIP_DESC[$software_id]='nginx | mariadb | php' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=53#p53' #------------------ software_id=81 - aSOFTWARE_WHIP_NAME[$software_id]='LLSP' - aSOFTWARE_WHIP_DESC[$software_id]='lighttpd | sqlite | php' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' + aSOFTWARE_WHIP_NAME[$software_id]='LLSP' + aSOFTWARE_WHIP_DESC[$software_id]='lighttpd | sqlite | php' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' #------------------ software_id=82 - aSOFTWARE_WHIP_NAME[$software_id]='LLMP' - aSOFTWARE_WHIP_DESC[$software_id]='lighttpd | mariadb | php' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' + aSOFTWARE_WHIP_NAME[$software_id]='LLMP' + aSOFTWARE_WHIP_DESC[$software_id]='lighttpd | mariadb | php' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' #------------------ software_id=83 - aSOFTWARE_WHIP_NAME[$software_id]='Apache2' - aSOFTWARE_WHIP_DESC[$software_id]='webserver' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=52#p52' + aSOFTWARE_WHIP_NAME[$software_id]='Apache2' + aSOFTWARE_WHIP_DESC[$software_id]='webserver' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=52#p52' #------------------ software_id=84 - aSOFTWARE_WHIP_NAME[$software_id]='Lighttpd' - aSOFTWARE_WHIP_DESC[$software_id]='webserver' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' + aSOFTWARE_WHIP_NAME[$software_id]='Lighttpd' + aSOFTWARE_WHIP_DESC[$software_id]='webserver' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' #------------------ software_id=85 - aSOFTWARE_WHIP_NAME[$software_id]='Nginx' - aSOFTWARE_WHIP_DESC[$software_id]='webserver' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=53#p53' + aSOFTWARE_WHIP_NAME[$software_id]='Nginx' + aSOFTWARE_WHIP_DESC[$software_id]='webserver' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=53#p53' #------------------ software_id=87 - aSOFTWARE_WHIP_NAME[$software_id]='SQlite' - aSOFTWARE_WHIP_DESC[$software_id]='database' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' + aSOFTWARE_WHIP_NAME[$software_id]='SQLite' + aSOFTWARE_WHIP_DESC[$software_id]='database' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' #------------------ software_id=88 - aSOFTWARE_WHIP_NAME[$software_id]='MariaDB' - aSOFTWARE_WHIP_DESC[$software_id]='database' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' + aSOFTWARE_WHIP_NAME[$software_id]='MariaDB' + aSOFTWARE_WHIP_DESC[$software_id]='database' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' #------------------ software_id=89 - aSOFTWARE_WHIP_NAME[$software_id]='PHP' - aSOFTWARE_WHIP_DESC[$software_id]='webserver' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' + aSOFTWARE_WHIP_NAME[$software_id]='PHP' + aSOFTWARE_WHIP_DESC[$software_id]='Hypertext Preprocessor for dynamic web content' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1335#p1335' #------------------ software_id=90 - aSOFTWARE_WHIP_NAME[$software_id]='phpMyAdmin' - aSOFTWARE_WHIP_DESC[$software_id]='optional mysql admin tools' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='phpMyAdmin' + aSOFTWARE_WHIP_DESC[$software_id]='optional mysql admin tools' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=54#p54' + aSOFTWARE_REQUIRES_MYSQL[$software_id]=1 + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=54#p54' #------------------ software_id=91 - aSOFTWARE_WHIP_NAME[$software_id]='Redis' - aSOFTWARE_WHIP_DESC[$software_id]='optional non-sql database store' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_WHIP_NAME[$software_id]='Redis' + aSOFTWARE_WHIP_DESC[$software_id]='optional non-sql database store' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 #------------------ software_id=92 - aSOFTWARE_WHIP_NAME[$software_id]='CertBot' - aSOFTWARE_WHIP_DESC[$software_id]='free, ssl cert install allowing https://' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1061#p1062' + aSOFTWARE_WHIP_NAME[$software_id]='CertBot' + aSOFTWARE_WHIP_DESC[$software_id]='free, ssl cert install allowing https://' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1061#p1062' #------------------ software_id=125 - aSOFTWARE_WHIP_NAME[$software_id]='Tomcat8' - aSOFTWARE_WHIP_DESC[$software_id]='apache tomcat server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=13 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4316#p4316' - aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Tomcat8' + aSOFTWARE_WHIP_DESC[$software_id]='apache tomcat server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=13 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=4316#p4316' + aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$software_id]=1 #PiHole #-------------------------------------------------------------------------------- software_id=93 - aSOFTWARE_WHIP_NAME[$software_id]='Pi-hole' - aSOFTWARE_WHIP_DESC[$software_id]='block adverts for any device on your network' - aSOFTWARE_CATEGORY_INDEX[$software_id]=14 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Pi-hole' + aSOFTWARE_WHIP_DESC[$software_id]='block adverts for any device on your network' + aSOFTWARE_CATEGORY_INDEX[$software_id]=14 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 aSOFTWARE_REQUIRES_WEBSERVER[$software_id]=1 - aSOFTWARE_REQUIRES_PHP[$software_id]=1 - aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=174#p174' + aSOFTWARE_REQUIRES_PHP[$software_id]=1 + aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=174#p174' aSOFTWARE_REQUIRES_USERINPUT[$software_id]=1 #File servers #-------------------------------------------------------------------------------- software_id=94 - aSOFTWARE_WHIP_NAME[$software_id]='ProFTP' - aSOFTWARE_WHIP_DESC[$software_id]='lightweight ftp server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=15 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=55#p55' + aSOFTWARE_WHIP_NAME[$software_id]='ProFTP' + aSOFTWARE_WHIP_DESC[$software_id]='lightweight ftp server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=15 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=55#p55' #------------------ software_id=95 - aSOFTWARE_WHIP_NAME[$software_id]='vsFTPD' - aSOFTWARE_WHIP_DESC[$software_id]='alternative ftp server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=15 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2820#p2820' + aSOFTWARE_WHIP_NAME[$software_id]='vsFTPD' + aSOFTWARE_WHIP_DESC[$software_id]='alternative ftp server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=15 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2820#p2820' #------------------ software_id=96 - aSOFTWARE_WHIP_NAME[$software_id]='Samba' - aSOFTWARE_WHIP_DESC[$software_id]='feature-rich file server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=15 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=56#p56' + aSOFTWARE_WHIP_NAME[$software_id]='Samba' + aSOFTWARE_WHIP_DESC[$software_id]='feature-rich file server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=15 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=56#p56' #------------------ software_id=109 - aSOFTWARE_WHIP_NAME[$software_id]='NFS' - aSOFTWARE_WHIP_DESC[$software_id]='network file system server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=15 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2821#p2821' + aSOFTWARE_WHIP_NAME[$software_id]='NFS' + aSOFTWARE_WHIP_DESC[$software_id]='network file system server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=15 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=2821#p2821' #------------------ @@ -1941,42 +1968,42 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=97 - aSOFTWARE_WHIP_NAME[$software_id]='OpenVPN' - aSOFTWARE_WHIP_DESC[$software_id]='vpn server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=16 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=613#p613' + aSOFTWARE_WHIP_NAME[$software_id]='OpenVPN' + aSOFTWARE_WHIP_DESC[$software_id]='vpn server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=16 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=613#p613' #------------------ software_id=117 - aSOFTWARE_WHIP_NAME[$software_id]='PiVPN' - aSOFTWARE_WHIP_DESC[$software_id]='openvpn server install & management tool' - aSOFTWARE_CATEGORY_INDEX[$software_id]=16 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3469#p3469' + aSOFTWARE_WHIP_NAME[$software_id]='PiVPN' + aSOFTWARE_WHIP_DESC[$software_id]='openvpn server install & management tool' + aSOFTWARE_CATEGORY_INDEX[$software_id]=16 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=3469#p3469' aSOFTWARE_REQUIRES_USERINPUT[$software_id]=1 #------------------ software_id=171 - aSOFTWARE_WHIP_NAME[$software_id]='DietPi-NordVPN' - aSOFTWARE_WHIP_DESC[$software_id]='vpn client with connection gui' - aSOFTWARE_CATEGORY_INDEX[$software_id]=16 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p15975#p15975' + aSOFTWARE_WHIP_NAME[$software_id]='DietPi-NordVPN' + aSOFTWARE_WHIP_DESC[$software_id]='vpn client with connection gui' + aSOFTWARE_CATEGORY_INDEX[$software_id]=16 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p15975#p15975' #------------------ software_id=172 - aSOFTWARE_WHIP_NAME[$software_id]='WireGuard' - aSOFTWARE_WHIP_DESC[$software_id]='an extremely simple yet fast and modern VPN' - aSOFTWARE_CATEGORY_INDEX[$software_id]=16 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=16308#p16308' + aSOFTWARE_WHIP_NAME[$software_id]='WireGuard' + aSOFTWARE_WHIP_DESC[$software_id]='an extremely simple yet fast and modern VPN' + aSOFTWARE_CATEGORY_INDEX[$software_id]=16 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=16308#p16308' # Required to ask for public domain/IP and desired VPN server port aSOFTWARE_REQUIRES_USERINPUT[$software_id]=1 @@ -1987,40 +2014,39 @@ _EOF_ aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,$i]=0 done - # Disable for ARMv6 + + # - ARMv6 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,1]=0 - # Enable RPi/x86_64/Odroids | ARMv6 disabled - if (( $G_HW_MODEL < 10 || - $G_HW_ARCH == 10 || - $G_HW_MODEL == 10 || $G_HW_MODEL == 11 || $G_HW_MODEL == 12 || $G_HW_MODEL == 14 )); then + + # Enable RPi/Odroids/x86_64 | ARMv6 disabled + if (( $G_HW_MODEL < 13 || $G_HW_MODEL == 14 || $G_HW_ARCH == 10 )); then aSOFTWARE_AVAIL_G_HW_MODEL[$software_id,$G_HW_MODEL]=1 fi - #Advanced Networking #-------------------------------------------------------------------------------- software_id=98 - aSOFTWARE_WHIP_NAME[$software_id]='HaProxy' - aSOFTWARE_WHIP_DESC[$software_id]='high performance tcp/http load balancer' - aSOFTWARE_CATEGORY_INDEX[$software_id]=17 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=221#p221' + aSOFTWARE_WHIP_NAME[$software_id]='HaProxy' + aSOFTWARE_WHIP_DESC[$software_id]='high performance tcp/http load balancer' + aSOFTWARE_CATEGORY_INDEX[$software_id]=17 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=221#p221' #Home automation #-------------------------------------------------------------------------------- software_id=99 - aSOFTWARE_WHIP_NAME[$software_id]='EmonPi' - aSOFTWARE_WHIP_DESC[$software_id]='energy usage addon board with web interface' - aSOFTWARE_CATEGORY_INDEX[$software_id]=18 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1525#p1525' + aSOFTWARE_WHIP_NAME[$software_id]='EmonPi' + aSOFTWARE_WHIP_DESC[$software_id]='energy usage addon board with web interface' + aSOFTWARE_CATEGORY_INDEX[$software_id]=18 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=1525#p1525' - # - Disable for All non-RPi + # - RPi only for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do @@ -2031,15 +2057,15 @@ _EOF_ #------------------ software_id=157 - aSOFTWARE_WHIP_NAME[$software_id]='Home Assistant' - aSOFTWARE_WHIP_DESC[$software_id]='open-source home automation platform' - aSOFTWARE_CATEGORY_INDEX[$software_id]=18 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 - aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=70#p70' + aSOFTWARE_WHIP_NAME[$software_id]='Home Assistant' + aSOFTWARE_WHIP_DESC[$software_id]='open-source home automation platform' + aSOFTWARE_CATEGORY_INDEX[$software_id]=18 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_REQUIRES_SQLITE[$software_id]=1 + aSOFTWARE_REQUIRES_FFMPEG[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=70#p70' #------------------ @@ -2047,26 +2073,26 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=137 - aSOFTWARE_WHIP_NAME[$software_id]='CloudPrint' - aSOFTWARE_WHIP_DESC[$software_id]='print server for google cloud print' - aSOFTWARE_CATEGORY_INDEX[$software_id]=19 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='f=8&t=5&p=6630#p6630' - aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 #Not required, but comes in as package dep + aSOFTWARE_WHIP_NAME[$software_id]='CloudPrint' + aSOFTWARE_WHIP_DESC[$software_id]='print server for google cloud print' + aSOFTWARE_CATEGORY_INDEX[$software_id]=19 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=6630#p6630' + aSOFTWARE_REQUIRES_RSYSLOG[$software_id]=1 # Not required, but comes in as package dep - #Disabled for ARMv8 on Jessie only: https://github.com/MichaIng/DietPi/issues/855#issuecomment-292712002 + # - ARMv8 on Jessie: https://github.com/MichaIng/DietPi/issues/855#issuecomment-292712002 (( $G_DISTRO == 3 )) && aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 #------------------ software_id=153 - aSOFTWARE_WHIP_NAME[$software_id]='OctoPrint' - aSOFTWARE_WHIP_DESC[$software_id]='web interface for controlling 3d printers' - aSOFTWARE_CATEGORY_INDEX[$software_id]=19 - aSOFTWARE_TYPE[$software_id]=0 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7958#p7958' - aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 - aSOFTWARE_REQUIRES_GIT[$software_id]=1 # Required for updates + aSOFTWARE_WHIP_NAME[$software_id]='OctoPrint' + aSOFTWARE_WHIP_DESC[$software_id]='web interface for controlling 3d printers' + aSOFTWARE_CATEGORY_INDEX[$software_id]=19 + aSOFTWARE_TYPE[$software_id]=0 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=7958#p7958' + aSOFTWARE_REQUIRES_BUILDESSENTIAL[$software_id]=1 + aSOFTWARE_REQUIRES_GIT[$software_id]=1 # Required for updates #-------------------------------------------------------------------------------- #Additional linux software items @@ -2076,74 +2102,74 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=0 - aSOFTWARE_WHIP_NAME[$software_id]='OpenSSH Client' - aSOFTWARE_WHIP_DESC[$software_id]='' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='OpenSSH Client' + aSOFTWARE_WHIP_DESC[$software_id]='' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=1 #------------------ #File server clients #-------------------------------------------------------------------------------- software_id=1 - aSOFTWARE_WHIP_NAME[$software_id]='Samba Client' - aSOFTWARE_WHIP_DESC[$software_id]='access network shares' - aSOFTWARE_CATEGORY_INDEX[$software_id]=1 - aSOFTWARE_TYPE[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]=' dietpi-config > Network Options: NAS/Misc' + aSOFTWARE_WHIP_NAME[$software_id]='Samba Client' + aSOFTWARE_WHIP_DESC[$software_id]='access network shares' + aSOFTWARE_CATEGORY_INDEX[$software_id]=1 + aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]=' dietpi-config > Network Options: NAS/Misc' #------------------ software_id=110 - aSOFTWARE_WHIP_NAME[$software_id]='NFS Client' - aSOFTWARE_WHIP_DESC[$software_id]='network file system client' - aSOFTWARE_CATEGORY_INDEX[$software_id]=1 - aSOFTWARE_TYPE[$software_id]=1 - aSOFTWARE_ONLINEDOC_URL[$software_id]=' dietpi-config > Network Options: NAS/Misc' + aSOFTWARE_WHIP_NAME[$software_id]='NFS Client' + aSOFTWARE_WHIP_DESC[$software_id]='network file system client' + aSOFTWARE_CATEGORY_INDEX[$software_id]=1 + aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_ONLINEDOC_URL[$software_id]=' dietpi-config > Network Options: NAS/Misc' #------------------ #File managers #-------------------------------------------------------------------------------- software_id=3 - aSOFTWARE_WHIP_NAME[$software_id]='MC' - aSOFTWARE_WHIP_DESC[$software_id]='midnight commander, powerful file manager' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='MC' + aSOFTWARE_WHIP_DESC[$software_id]='midnight commander, powerful file manager' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=4 - aSOFTWARE_WHIP_NAME[$software_id]='ViFM' - aSOFTWARE_WHIP_DESC[$software_id]='file manager with vi bindings' - aSOFTWARE_CATEGORY_INDEX[$software_id]=2 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='ViFM' + aSOFTWARE_WHIP_DESC[$software_id]='file manager with vi bindings' + aSOFTWARE_CATEGORY_INDEX[$software_id]=2 + aSOFTWARE_TYPE[$software_id]=1 #------------------ #System #-------------------------------------------------------------------------------- software_id=5 - aSOFTWARE_WHIP_NAME[$software_id]='ALSA' - aSOFTWARE_WHIP_DESC[$software_id]='linux sound system' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='ALSA' + aSOFTWARE_WHIP_DESC[$software_id]='linux sound system' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=6 - aSOFTWARE_WHIP_NAME[$software_id]='Xserver' - aSOFTWARE_WHIP_DESC[$software_id]='linux display system' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Xserver' + aSOFTWARE_WHIP_DESC[$software_id]='linux display system' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=151 - aSOFTWARE_WHIP_NAME[$software_id]='Nvidia' - aSOFTWARE_WHIP_DESC[$software_id]='display driver' - aSOFTWARE_CATEGORY_INDEX[$software_id]=3 - aSOFTWARE_TYPE[$software_id]=1 - aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Nvidia' + aSOFTWARE_WHIP_DESC[$software_id]='display driver' + aSOFTWARE_CATEGORY_INDEX[$software_id]=3 + aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - # NativePC only + # Native PC only for ((i=0; i<=$MAX_G_HW_MODEL; i++)) do @@ -2156,194 +2182,182 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=7 - aSOFTWARE_WHIP_NAME[$software_id]='FFmpeg' - aSOFTWARE_WHIP_DESC[$software_id]='audio & visual libary' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='FFmpeg' + aSOFTWARE_WHIP_DESC[$software_id]='audio & visual libary' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=8 - aSOFTWARE_WHIP_NAME[$software_id]='Java' - aSOFTWARE_WHIP_DESC[$software_id]='OpenJDK 8 + JRE libary' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Java' + aSOFTWARE_WHIP_DESC[$software_id]='OpenJDK 8 + JRE libary' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=9 - aSOFTWARE_WHIP_NAME[$software_id]='Node.js' - aSOFTWARE_WHIP_DESC[$software_id]='javascript runtime' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Node.js' + aSOFTWARE_WHIP_DESC[$software_id]='javascript runtime' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=130 - aSOFTWARE_WHIP_NAME[$software_id]='Python Pip' - aSOFTWARE_WHIP_DESC[$software_id]='python pip package installer' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Python Pip' + aSOFTWARE_WHIP_DESC[$software_id]='python pip package installer' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=140 - aSOFTWARE_WHIP_NAME[$software_id]='SDL2' - aSOFTWARE_WHIP_DESC[$software_id]='simple direct layer 2' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=1 - SOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='SDL2' + aSOFTWARE_WHIP_DESC[$software_id]='simple direct layer 2' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=1 + SOFTWARE_REQUIRES_XSERVERXORG[$software_id]=1 - # Disable for ARMv8 + # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$software_id,3]=0 - #------------------ software_id=150 - aSOFTWARE_WHIP_NAME[$software_id]='Mono' - aSOFTWARE_WHIP_DESC[$software_id]='runtime libraries and repo' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=1 - - + aSOFTWARE_WHIP_NAME[$software_id]='Mono' + aSOFTWARE_WHIP_DESC[$software_id]='runtime libraries and repo' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=126 - aSOFTWARE_WHIP_NAME[$software_id]='LibSSL1.0.0' - aSOFTWARE_WHIP_DESC[$software_id]='backwards compatibility (stretch)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=4 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='LibSSL1.0.0' + aSOFTWARE_WHIP_DESC[$software_id]='backwards compatibility (stretch)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=4 + aSOFTWARE_TYPE[$software_id]=1 #Networking #-------------------------------------------------------------------------------- software_id=10 - aSOFTWARE_WHIP_NAME[$software_id]='iftop' - aSOFTWARE_WHIP_DESC[$software_id]='displays bandwidth usage information' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='iftop' + aSOFTWARE_WHIP_DESC[$software_id]='displays bandwidth usage information' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=11 - aSOFTWARE_WHIP_NAME[$software_id]='IPTraf' - aSOFTWARE_WHIP_DESC[$software_id]='interactive colorful ip lan monitor' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='IPTraf' + aSOFTWARE_WHIP_DESC[$software_id]='interactive colorful ip lan monitor' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=12 - aSOFTWARE_WHIP_NAME[$software_id]='Iperf' - aSOFTWARE_WHIP_DESC[$software_id]='internet protocol bandwidth measuring tool' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Iperf' + aSOFTWARE_WHIP_DESC[$software_id]='internet protocol bandwidth measuring tool' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=13 - aSOFTWARE_WHIP_NAME[$software_id]='MTR-Tiny' - aSOFTWARE_WHIP_DESC[$software_id]='full screen ncurses traceroute tool' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='MTR-Tiny' + aSOFTWARE_WHIP_DESC[$software_id]='full screen ncurses traceroute tool' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=14 - aSOFTWARE_WHIP_NAME[$software_id]='nLoad' - aSOFTWARE_WHIP_DESC[$software_id]='realtime console network usage monitor' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='nLoad' + aSOFTWARE_WHIP_DESC[$software_id]='realtime console network usage monitor' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=15 - aSOFTWARE_WHIP_NAME[$software_id]='tcpdump' - aSOFTWARE_WHIP_DESC[$software_id]='command-line network traffic analyzer' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='tcpdump' + aSOFTWARE_WHIP_DESC[$software_id]='command-line network traffic analyzer' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=152 - aSOFTWARE_WHIP_NAME[$software_id]='Avahi-Daemon' - aSOFTWARE_WHIP_DESC[$software_id]='hostname broadcast (mac, pc bonjour)' - aSOFTWARE_CATEGORY_INDEX[$software_id]=5 - aSOFTWARE_TYPE[$software_id]=1 - + aSOFTWARE_WHIP_NAME[$software_id]='Avahi-Daemon' + aSOFTWARE_WHIP_DESC[$software_id]='hostname broadcast (mac, pc bonjour)' + aSOFTWARE_CATEGORY_INDEX[$software_id]=5 + aSOFTWARE_TYPE[$software_id]=1 #Development / Programming #-------------------------------------------------------------------------------- software_id=16 - aSOFTWARE_WHIP_NAME[$software_id]='Build-Essentials' - aSOFTWARE_WHIP_DESC[$software_id]='common packages for compile' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Build-Essentials' + aSOFTWARE_WHIP_DESC[$software_id]='common packages for compile' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=17 - aSOFTWARE_WHIP_NAME[$software_id]='Git Client' - aSOFTWARE_WHIP_DESC[$software_id]='git clone etc' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Git Client' + aSOFTWARE_WHIP_DESC[$software_id]='git clone etc' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=170 - aSOFTWARE_WHIP_NAME[$software_id]='Unrar' - aSOFTWARE_WHIP_DESC[$software_id]='unarchiver for .rar files' - aSOFTWARE_CATEGORY_INDEX[$software_id]=6 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Unrar' + aSOFTWARE_WHIP_DESC[$software_id]='unarchiver for .rar files' + aSOFTWARE_CATEGORY_INDEX[$software_id]=6 + aSOFTWARE_TYPE[$software_id]=1 #------------------ #Text Editors #-------------------------------------------------------------------------------- software_id=18 - aSOFTWARE_WHIP_NAME[$software_id]='Emacs' - aSOFTWARE_WHIP_DESC[$software_id]='gnu emacs editor' - aSOFTWARE_CATEGORY_INDEX[$software_id]=7 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Emacs' + aSOFTWARE_WHIP_DESC[$software_id]='gnu emacs editor' + aSOFTWARE_CATEGORY_INDEX[$software_id]=7 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=19 - aSOFTWARE_WHIP_NAME[$software_id]='Jed' - aSOFTWARE_WHIP_DESC[$software_id]='editor for programmers' - aSOFTWARE_CATEGORY_INDEX[$software_id]=7 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Jed' + aSOFTWARE_WHIP_DESC[$software_id]='editor for programmers' + aSOFTWARE_CATEGORY_INDEX[$software_id]=7 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=20 - aSOFTWARE_WHIP_NAME[$software_id]='Vim' - aSOFTWARE_WHIP_DESC[$software_id]='vi enhanced text editor' - aSOFTWARE_CATEGORY_INDEX[$software_id]=7 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Vim' + aSOFTWARE_WHIP_DESC[$software_id]='vi enhanced text editor' + aSOFTWARE_CATEGORY_INDEX[$software_id]=7 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=21 - aSOFTWARE_WHIP_NAME[$software_id]='Vim-Tiny' - aSOFTWARE_WHIP_DESC[$software_id]='compact release of vim' - aSOFTWARE_CATEGORY_INDEX[$software_id]=7 - aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_WHIP_NAME[$software_id]='Vim-Tiny' + aSOFTWARE_WHIP_DESC[$software_id]='compact release of vim' + aSOFTWARE_CATEGORY_INDEX[$software_id]=7 + aSOFTWARE_TYPE[$software_id]=1 #------------------ software_id=127 - aSOFTWARE_WHIP_NAME[$software_id]='NeoVim' - aSOFTWARE_WHIP_DESC[$software_id]='heavily refactored vim fork' - aSOFTWARE_CATEGORY_INDEX[$software_id]=7 - aSOFTWARE_TYPE[$software_id]=1 - - # - Stretch only - for ((i=3; i<=$MAX_G_DISTRO; i++)) - do - - aSOFTWARE_AVAIL_G_DISTRO[$software_id,$G_DISTRO]=0 - - done - aSOFTWARE_AVAIL_G_DISTRO[$software_id,4]=1 + aSOFTWARE_WHIP_NAME[$software_id]='NeoVim' + aSOFTWARE_WHIP_DESC[$software_id]='heavily refactored vim fork' + aSOFTWARE_CATEGORY_INDEX[$software_id]=7 + aSOFTWARE_TYPE[$software_id]=1 + # - Jessie + aSOFTWARE_AVAIL_G_DISTRO[$software_id,3]=0 #------------------ #Desktop Utilities #-------------------------------------------------------------------------------- software_id=22 - aSOFTWARE_WHIP_NAME[$software_id]='QuiteRSS' - aSOFTWARE_WHIP_DESC[$software_id]='cross-platform, free rss reader' - aSOFTWARE_CATEGORY_INDEX[$software_id]=8 - aSOFTWARE_TYPE[$software_id]=1 - aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 - + aSOFTWARE_WHIP_NAME[$software_id]='QuiteRSS' + aSOFTWARE_WHIP_DESC[$software_id]='cross-platform, free rss reader' + aSOFTWARE_CATEGORY_INDEX[$software_id]=8 + aSOFTWARE_TYPE[$software_id]=1 + aSOFTWARE_REQUIRES_DESKTOP[$software_id]=1 #------------------ #-------------------------------------------------------------------------------- @@ -2351,27 +2365,27 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=101 - aSOFTWARE_WHIP_NAME[$software_id]='Log Rotate' - aSOFTWARE_WHIP_DESC[$software_id]='rotates log files' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=68#p68' + aSOFTWARE_WHIP_NAME[$software_id]='Log Rotate' + aSOFTWARE_WHIP_DESC[$software_id]='rotates log files' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=68#p68' #------------------ software_id=102 - aSOFTWARE_WHIP_NAME[$software_id]='Rsyslog' - aSOFTWARE_WHIP_DESC[$software_id]='system logging' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=68#p68' + aSOFTWARE_WHIP_NAME[$software_id]='Rsyslog' + aSOFTWARE_WHIP_DESC[$software_id]='system logging' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=68#p68' #------------------ software_id=103 - aSOFTWARE_WHIP_NAME[$software_id]='DietPi-RAMlog' - aSOFTWARE_WHIP_DESC[$software_id]='minimal, optimized logging' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=68#p68' + aSOFTWARE_WHIP_NAME[$software_id]='DietPi-RAMlog' + aSOFTWARE_WHIP_DESC[$software_id]='minimal, optimized logging' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=68#p68' #------------------ #-------------------------------------------------------------------------------- @@ -2379,19 +2393,19 @@ _EOF_ #-------------------------------------------------------------------------------- software_id=104 - aSOFTWARE_WHIP_NAME[$software_id]='Dropbear' - aSOFTWARE_WHIP_DESC[$software_id]='lightweight ssh server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=62#p62' + aSOFTWARE_WHIP_NAME[$software_id]='Dropbear' + aSOFTWARE_WHIP_DESC[$software_id]='lightweight ssh server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=62#p62' #------------------ software_id=105 - aSOFTWARE_WHIP_NAME[$software_id]='OpenSSH Server' - aSOFTWARE_WHIP_DESC[$software_id]='feature rich ssh server' - aSOFTWARE_CATEGORY_INDEX[$software_id]=0 - aSOFTWARE_TYPE[$software_id]=-1 - aSOFTWARE_ONLINEDOC_URL[$software_id]='p=63#p63' + aSOFTWARE_WHIP_NAME[$software_id]='OpenSSH Server' + aSOFTWARE_WHIP_DESC[$software_id]='feature rich ssh server' + aSOFTWARE_CATEGORY_INDEX[$software_id]=0 + aSOFTWARE_TYPE[$software_id]=-1 + aSOFTWARE_ONLINEDOC_URL[$software_id]='p=63#p63' #------------------ #-------------------------------------------------------------------------------- @@ -2434,16 +2448,16 @@ _EOF_ } - #Work out which additional software we need to install + # Work out which additional software we need to install # - We do reinstall =2 marked software as well, just to be sure. Install_Flag_Prereq_Software(){ - G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" "Checking for prerequisite software" + G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" 'Checking for prerequisite software' local software_id=-1 #------------------------------------------------------------------------- - #Pre-req software, for items that do not have their own array aSOFTWARE_REQUIRES_SOFTWARENAME + # Pre-req software, for items that do NOT have their own array aSOFTWARE_REQUIRES_SOFTWARENAME #Nextcloud extensions # Nextcloud Talk @@ -2456,6 +2470,15 @@ _EOF_ fi + #Tor Hotspot requires WiFi Hotspot + software_id=60 + if (( ${aSOFTWARE_INSTALL_STATE[61]} == 1 )); then + + aSOFTWARE_INSTALL_STATE[$software_id]=1 + G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$software_id]} will be installed" + + fi + #Additional software that requires VNC4server # XRDP: https://github.com/MichaIng/DietPi/issues/1727 software_id=28 @@ -2481,16 +2504,9 @@ _EOF_ aSOFTWARE_INSTALL_STATE[36]=1 # Squeezelite aSOFTWARE_INSTALL_STATE[37]=1 # Shairport Sync - - # if (( $G_HW_MODEL == 70 )); then - - # aSOFTWARE_INSTALL_STATE[60]=1 # WiFi Hotspot - - # fi - + #(( $G_HW_MODEL == 70 )) && aSOFTWARE_INSTALL_STATE[60]=1 # WiFi Hotspot aSOFTWARE_INSTALL_STATE[65]=1 # Netdata aSOFTWARE_INSTALL_STATE[96]=1 # Samba - aSOFTWARE_INSTALL_STATE[121]=1 # Roon Bridge aSOFTWARE_INSTALL_STATE[124]=1 # NAA Daemon #aSOFTWARE_INSTALL_STATE[128]=1 # MPD (pulled in by O!MPD) @@ -2518,8 +2534,6 @@ _EOF_ ${aSOFTWARE_INSTALL_STATE[163]} == 1 )); then aSOFTWARE_INSTALL_STATE[$software_id]=1 - - #aSOFTWARE_WHIP_NAME G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$software_id]} will be installed" fi @@ -2532,8 +2546,6 @@ _EOF_ ${aSOFTWARE_INSTALL_STATE[134]} == 1 )); then aSOFTWARE_INSTALL_STATE[$software_id]=1 - - #aSOFTWARE_WHIP_NAME G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$software_id]} will be installed" fi @@ -2617,9 +2629,9 @@ _EOF_ fi #------------------------------------------------------------------------- - #WEBSERVER - Manual stack install + # WEBSERVER - Manual stack install # - Define extra DietPi install flags for WEBSERVER_STACKS - #LLMP + # LLMP if (( ${aSOFTWARE_INSTALL_STATE[82]} == 1 )); then aSOFTWARE_INSTALL_STATE[84]=1 @@ -2628,7 +2640,7 @@ _EOF_ fi - #LLSP + # LLSP if (( ${aSOFTWARE_INSTALL_STATE[81]} == 1 )); then aSOFTWARE_INSTALL_STATE[84]=1 @@ -2637,7 +2649,7 @@ _EOF_ fi - #LEMP + # LEMP if (( ${aSOFTWARE_INSTALL_STATE[79]} == 1 )); then aSOFTWARE_INSTALL_STATE[85]=1 @@ -2646,7 +2658,7 @@ _EOF_ fi - #LESP + # LESP if (( ${aSOFTWARE_INSTALL_STATE[78]} == 1 )); then aSOFTWARE_INSTALL_STATE[85]=1 @@ -2655,7 +2667,7 @@ _EOF_ fi - #LAMP + # LAMP if (( ${aSOFTWARE_INSTALL_STATE[76]} == 1 )); then aSOFTWARE_INSTALL_STATE[83]=1 @@ -2664,7 +2676,7 @@ _EOF_ fi - #LASP + # LASP if (( ${aSOFTWARE_INSTALL_STATE[75]} == 1 )); then aSOFTWARE_INSTALL_STATE[83]=1 @@ -2674,15 +2686,15 @@ _EOF_ fi #------------------------------------------------------------------------- - #Pre-req software, for items that do DO have their own array aSOFTWARE_REQUIRES_SOFTWARENAME + # Pre-req software, for items that DO have their own array aSOFTWARE_REQUIRES_SOFTWARENAME for i in ${!aSOFTWARE_INSTALL_STATE[@]} do (( ${aSOFTWARE_INSTALL_STATE[$i]} != 1 )) && continue - #WEBSERVER - Auto install via choice system - # - Check for existing webserver base (Apache2,Nginx,Lighttpd) installation + # WEBSERVER - Auto install via choice system + # - Check for existing webserver base (Apache2, Nginx, Lighttpd) installation if (( ${aSOFTWARE_REQUIRES_WEBSERVER[$i]:=0} && ${aSOFTWARE_INSTALL_STATE[83]} < 1 && ${aSOFTWARE_INSTALL_STATE[84]} < 1 && @@ -2691,19 +2703,19 @@ _EOF_ # - None found, select one for install, based on user preference if (( $INDEX_WEBSERVER_TARGET == 0 )); then - #WEBSERVER_APACHE + # WEBSERVER_APACHE aSOFTWARE_INSTALL_STATE[83]=1 G_DIETPI-NOTIFY 2 'Apache2 will be installed' elif (( $INDEX_WEBSERVER_TARGET == -1 )); then - #WEBSERVER_NGINX + # WEBSERVER_NGINX aSOFTWARE_INSTALL_STATE[85]=1 G_DIETPI-NOTIFY 2 'Nginx will be installed' else - #WEBSERVER_LIGHTTPD + # WEBSERVER_LIGHTTPD aSOFTWARE_INSTALL_STATE[84]=1 G_DIETPI-NOTIFY 2 'Lighttpd will be installed' @@ -2714,7 +2726,7 @@ _EOF_ fi - #WEBSERVER_PHP + # WEBSERVER_PHP software_id=89 if (( ${aSOFTWARE_REQUIRES_PHP[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2723,7 +2735,7 @@ _EOF_ fi - #WEBSERVER_MARIADB + # WEBSERVER_MARIADB software_id=88 if (( ${aSOFTWARE_REQUIRES_MYSQL[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2732,21 +2744,22 @@ _EOF_ fi - #WEBSERVER_SQLITE + # WEBSERVER_SQLITE software_id=87 if (( ${aSOFTWARE_REQUIRES_SQLITE[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then aSOFTWARE_INSTALL_STATE[$software_id]=1 - G_DIETPI-NOTIFY 2 'SQlite will be installed' + G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$software_id]} will be installed" fi - #DESKTOP + # DESKTOP if (( ${aSOFTWARE_REQUIRES_DESKTOP[$i]:=0} && ${aSOFTWARE_INSTALL_STATE[23]} < 1 && ${aSOFTWARE_INSTALL_STATE[24]} < 1 && ${aSOFTWARE_INSTALL_STATE[25]} < 1 && - ${aSOFTWARE_INSTALL_STATE[26]} < 1)); then + ${aSOFTWARE_INSTALL_STATE[26]} < 1 && + ${aSOFTWARE_INSTALL_STATE[173]} < 1 )); then # - If no desktop is selected or installed (0), default to LXDE aSOFTWARE_INSTALL_STATE[23]=1 @@ -2757,7 +2770,7 @@ _EOF_ fi - #GIT + # GIT software_id=17 if (( ${aSOFTWARE_REQUIRES_GIT[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2765,7 +2778,7 @@ _EOF_ G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$software_id]} will be installed" fi - #BUILDESSENTIAL + # BUILDESSENTIAL software_id=16 if (( ${aSOFTWARE_REQUIRES_BUILDESSENTIAL[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2774,7 +2787,7 @@ _EOF_ fi - #RSYSLOG + # RSYSLOG software_id=102 if (( ${aSOFTWARE_REQUIRES_RSYSLOG[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2782,7 +2795,7 @@ _EOF_ G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$software_id]} will be installed" fi - #FFMPEG + # FFMPEG software_id=7 if (( ${aSOFTWARE_REQUIRES_FFMPEG[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2791,7 +2804,7 @@ _EOF_ fi - #ORACLEJAVA + # JAVA software_id=8 if (( ${aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2800,7 +2813,7 @@ _EOF_ fi - #NODEJS + # NODEJS software_id=9 if (( ${aSOFTWARE_REQUIRES_NODEJS[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2809,7 +2822,7 @@ _EOF_ fi - #ALSA + # ALSA software_id=5 if (( ${aSOFTWARE_REQUIRES_ALSA[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2818,7 +2831,7 @@ _EOF_ fi - #XSERVERXORG + # XSERVERXORG software_id=6 if (( ${aSOFTWARE_REQUIRES_XSERVERXORG[$i]:=0} && aSOFTWARE_INSTALL_STATE[$software_id] != 1 )); then @@ -2829,65 +2842,49 @@ _EOF_ done - #WEBSERVER - Check for stacks and flag as installing - #WEBSERVER_APACHE + # WEBSERVER - Check for stacks and flag as installing + # WEBSERVER_APACHE if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then - #SQLite - if (( ${aSOFTWARE_INSTALL_STATE[87]} > 0 )); then - - #WEBSERVER_LASP - aSOFTWARE_INSTALL_STATE[75]=1 - - fi - - #MariaDB - if (( ${aSOFTWARE_INSTALL_STATE[88]} > 0 )); then - - #WEBSERVER_LAMP - aSOFTWARE_INSTALL_STATE[76]=1 - - fi + # SQLite: LASP + (( ${aSOFTWARE_INSTALL_STATE[87]} > 0 )) && aSOFTWARE_INSTALL_STATE[75]=1 + # MariaDB: LAMP + (( ${aSOFTWARE_INSTALL_STATE[88]} > 0 )) && aSOFTWARE_INSTALL_STATE[76]=1 - #WEBSERVER_NGINX + # WEBSERVER_NGINX elif (( ${aSOFTWARE_INSTALL_STATE[85]} > 0 )); then - #SQLite - if (( ${aSOFTWARE_INSTALL_STATE[87]} > 0 )); then - - #WEBSERVER_LESP - aSOFTWARE_INSTALL_STATE[78]=1 - - fi - - #MariaDB - if (( ${aSOFTWARE_INSTALL_STATE[88]} > 0 )); then - - #WEBSERVER_LEMP - aSOFTWARE_INSTALL_STATE[79]=1 + # SQLite: LESP + (( ${aSOFTWARE_INSTALL_STATE[87]} > 0 )) && aSOFTWARE_INSTALL_STATE[78]=1 - fi + # MariaDB: LEMP + (( ${aSOFTWARE_INSTALL_STATE[88]} > 0 )) && aSOFTWARE_INSTALL_STATE[79]=1 - #WEBSERVER_LIGHTTPD + # WEBSERVER_LIGHTTPD elif (( ${aSOFTWARE_INSTALL_STATE[84]} > 0 )); then - #SQLite - if (( ${aSOFTWARE_INSTALL_STATE[87]} > 0 )); then + # SQLite: LLSP + (( ${aSOFTWARE_INSTALL_STATE[87]} > 0 )) && aSOFTWARE_INSTALL_STATE[81]=1 - #WEBSERVER_LLSP - aSOFTWARE_INSTALL_STATE[81]=1 + # MariaDB: LLMP + (( ${aSOFTWARE_INSTALL_STATE[88]} > 0 )) && aSOFTWARE_INSTALL_STATE[82]=1 - fi + fi - #MariaDB - if (( ${aSOFTWARE_INSTALL_STATE[88]} > 0 )); then + # Update PHP variables after all software titles have been marked. + if (( ${aSOFTWARE_INSTALL_STATE[89]} > 0 )); then - #WEBSERVER_LLMP - aSOFTWARE_INSTALL_STATE[82]=1 + # ownCloud (up to v10.2) does not yet support PHP7.3, so install PHP7.2 for now + if (( ${aSOFTWARE_INSTALL_STATE[47]} > 0 )) || [[ -f '/var/www/owncloud/version.php' ]]; then - fi + FP_PHP_BASE_DIR='/etc/php/7.2' + PHP_NAME='php7.2' + # - Prevent accidental PHP7.3 installs + echo -e '# ownCloud does not yet support PHP7.3 +Package: *php7.3*\nPin: release *\nPin-Priority: -1' > /etc/apt/preferences.d/dietpi-owncloud + fi fi @@ -2927,16 +2924,16 @@ _EOF_ ) - for (( i=0; i<${#adesktop_items[@]}; i++)) + for i in ${adesktop_items[@]} do - G_THREAD_START wget https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/desktop/apps/${adesktop_items[$i]} -O /usr/share/applications/${adesktop_items[$i]} + G_THREAD_START wget https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/desktop/apps/$i -O /usr/share/applications/$i done unset adesktop_items - # - icons + # - Icons G_THREAD_START wget https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/desktop/icons/dietpi-icon.png -O /var/lib/dietpi/dietpi-software/installed/desktop/icons/dietpi-icon.png G_THREAD_START wget https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/desktop/icons/grey_16x16.png -O /var/lib/dietpi/dietpi-software/installed/desktop/icons/grey_16x16.png G_THREAD_START wget https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/desktop/icons/kodi-icon.png -O /var/lib/dietpi/dietpi-software/installed/desktop/icons/kodi-icon.png @@ -2971,7 +2968,6 @@ _EOF_ if [[ ! -f $G_FP_DIETPI_USERDATA/$FOLDER_MUSIC/fourdee_tech.ogg ]]; then - #Grab My test music wget https://dietpi.com/downloads/audio/fourdee_tech.ogg -O $G_FP_DIETPI_USERDATA/$FOLDER_MUSIC/fourdee_tech.ogg #wget https://dietpi.com/downloads/audio/fourdee_space.mp3 -O $G_FP_DIETPI_USERDATA/$FOLDER_MUSIC/fourdee_space.mp3 @@ -2979,7 +2975,7 @@ _EOF_ } - #Return optimization values for BitTorrent servers based on device and hardware capabilities. + # Return optimisation values for BitTorrent servers based on device and hardware capabilities. Optimize_BitTorrent(){ local output=0 @@ -2992,12 +2988,12 @@ _EOF_ fi - #Cache size (MB) 1/10th of total mem + # Cache size (MB) 1/10th of total mem if (( $1 == 0 )); then output=$(( $RAM_TOTAL / 10 )) - #Max active downloads + # Max active downloads elif (( $1 == 1 )); then output=2 @@ -3005,7 +3001,7 @@ _EOF_ # - Bump up for x86 (( $G_HW_ARCH == 10 )) && output=3 - #Max global connections + # Max global connections elif (( $1 == 2 )); then output=20 @@ -3015,45 +3011,45 @@ _EOF_ output=40 - # - 1Gbit SBC's + # - Gbit devices elif (( $gigabit_device )); then output=30 - # - Reduce for RPi's. This is due to the USB bus ethernet in the ARM SoC, which cripples network throughput/performance/latency. - # - RPi v3 + # - Reduce for RPi. This is due to the USB bus ethernet in the ARM SoC, which cripples network throughput/performance/latency. + # - RPi3 elif (( $G_HW_MODEL == 3 )); then output=15 - # - RPi v2 + # - RPi2 elif (( $G_HW_MODEL == 2 )); then output=13 - # - RPi v1 256/512 + # - RPi1 256/512 elif (( $G_HW_MODEL <= 1 )); then output=7 fi - #Max upload slots + # Max upload slots elif (( $1 == 3 )); then output=3 # - Bump up for x86 - if (( $G_HW_MODEL == 20 || $G_HW_MODEL == 21 )); then + if (( $G_HW_ARCH == 10 )); then output=5 - # - 1Gbit devices + # - Gbit devices elif (( $gigabit_device )); then output=4 - # - Reduce for RPi's. This is due to the USB bus ethernet in the ARM SoC, which cripples network throughput/performance/latency. + # - Reduce for RPi. This is due to the USB bus ethernet in the ARM SoC, which cripples network throughput/performance/latency. elif (( $G_HW_MODEL <= 3 )); then output=2 @@ -3066,40 +3062,40 @@ _EOF_ } - #NB: This does not support installs that require user input (eg: a whiptail prompt for deb installs) + # Usage: # Download_Install 'https://file.com/file' /etc/install_here # dps_index=$software_id Download_Install 'conf_0' /etc/conf.conf + # Optional input variables: + # fallback_url='http...' = URL to use if e.g. grabbing URL from api.github.com fails: https://dietpi.com/phpbb/viewtopic.php?p=17390#p17390 + # no_check_url=[01] = Optionally disable URL check + # dps_index=$software_id = Download from DietPi GitHub repo based on software ID/index + # DEPS_LIST='pkg1 ...' = Install APT dependency packages + # NB: This does not support installs that require user input (eg: a whiptail prompt for deb installs) Download_Install(){ - #no_check_url = Optional disable URL check local url=$1 + [[ ! $url && $fallback_url ]] && url=$fallback_url local target=$2 # Extract target - local type=${url##*.} # grab ext from URL | compatbile with >> deb|zip|tar(.gz|.bz2)|7z - if [[ $type == 'gz' || $type == 'bz2' ]]; then - - type='tar' - - fi + local type=${url##*.} # Grab ext from URL | compatbile with >> deb|zip|tar(.gz|.bz2)|7z + [[ $type == 'gz' || $type == 'bz2' ]] && type='tar' + local file="$software_id.$type" - # - DietPi-Software conf/service mode - local dps_index=${dps_index:--1} - if (( $dps_index >= 0 )); then + # DietPi-Software conf/service mode + if disable_error=1 G_CHECK_VALIDINT "$dps_index" 0; then - type=$url - url="https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/dps_$dps_index/$type" + type='dps_index' + url="https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/dps_$dps_index/$url" fi - local file="$software_id.$type" - (( $no_check_url )) || G_CHECK_URL "$url" - unset no_check_url cd /tmp/$G_PROGRAM_NAME - # Download file (+thread if APT pre-reqs are to be installed) + # Download file if [[ $DEPS_LIST ]]; then + # - Download as background thread if dependencies are to be installed G_THREAD_START wget "$url" -O $file G_AGI $DEPS_LIST DEPS_LIST='' @@ -3112,42 +3108,36 @@ _EOF_ fi # Process downloaded file - if (( $dps_index >= 0 )); then + if [[ $type == dps_index ]]; then - # - Precreate dir + # - Pre-create dir local fp_dir=${target%/*} - if [[ ! -d $fp_dir ]]; then + [[ -d $fp_dir ]] || G_RUN_CMD mkdir -p "$fp_dir" - G_RUN_CMD mkdir -p $fp_dir - - fi - - [[ -f $target ]] && G_WHIP_MSG "[INFO] Configuration/data updated for:\n - $target" - - G_RUN_CMD cp -f $file $target + [[ -f $target ]] && G_WHIP_MSG "[INFO] Updating file: $target" + G_RUN_CMD mv $file "$target" elif [[ $type == deb ]]; then - # Allow error on first attempt, giving APT fix a change to resolve e.g. dependencies - l_message='Installing deb package' G_USER_INPUTS=0 G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD dpkg -i $file + # - Allow error on first attempt, giving APT fix a change to resolve e.g. dependencies + G_USER_INPUTS=0 G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD dpkg --force-hold,confdef,confold -i $file (( $G_ERROR_HANDLER_EXITCODE_RETURN )) && G_DIETPI-NOTIFY 2 'Trying automated APT fix' && G_AGF - #(( $G_ERROR_HANDLER_EXITCODE_RETURN )) && error? - elif [[ $type == zip ]]; then [[ $target ]] && target="-d $target" - l_message='Unzipping archive' G_RUN_CMD unzip -o $file $target + G_RUN_CMD unzip -o $file "$target" elif [[ $type == tar ]]; then - [[ $target ]] && mkdir -p $target && target="-C $target" - l_message='Unpacking tarball' G_RUN_CMD tar xf $file $target + #[[ $target ]] && target="--one-top-level=$target" # Option exist not on Jessie + [[ $target ]] && G_RUN_CMD mkdir -p "$target" && target="-C $target" + G_RUN_CMD tar xf $file "$target" elif [[ $type == 7z ]]; then [[ $target ]] && target="-o$target" - l_message='Extracting 7zip archive' G_RUN_CMD 7zr x -y $file $target + G_RUN_CMD 7zr x -y $file "$target" else @@ -3155,7 +3145,8 @@ _EOF_ fi - [[ -f $file ]] && l_message='Cleaning download directory' G_RUN_CMD rm $file + [[ -f $file ]] && G_RUN_CMD rm $file + unset fallback_url dps_index no_check_url } @@ -3192,13 +3183,13 @@ _EOF_ # # G_CHECK_URL "$INSTALL_URL_ADDRESS" # - # #Install Python and PIP + # # Install Python and PIP # G_AGI python python-pip python-imaging # # cd /root # git clone --depth=1 "$INSTALL_URL_ADDRESS" # - # # - Move HTPC Manager to a 'better' location + # # Move HTPC Manager to a 'better' location # mkdir -p $G_FP_DIETPI_USERDATA/htpc-manager # mv /root/HTPC-Manager/* $G_FP_DIETPI_USERDATA/htpc-manager/ # rm -R /root/HTPC-Manager @@ -3209,12 +3200,11 @@ _EOF_ Install_Dietpi_Software(){ #-------------------------------------------------------------- - #Install Software + # Install Software local software_id=-1 - #Desktop LXDE - software_id=23 + software_id=23 # Desktop LXDE if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3226,7 +3216,7 @@ _EOF_ G_AGI lxde upower policykit-1 firefox-esr #upower policykit-1. Needed for LXDE logout menu item to show shutdown/restart ... - #RPi, revert to Debian pcmanfm install package: https://github.com/MichaIng/DietPi/issues/1558#issuecomment-390328173 + # - RPi, revert to Debian pcmanfm install package: https://github.com/MichaIng/DietPi/issues/1558#issuecomment-390328173 if (( $G_HW_MODEL < 10 )); then Download_Install 'https://dietpi.com/downloads/binaries/all/pcmanfm_1.2.5-3_armhf.deb' @@ -3236,8 +3226,24 @@ _EOF_ fi - #Desktop MATE - software_id=24 + software_id=173 # Desktop LXQt + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then + + Banner_Installing + + # - For desktop entries/icons hosted on dietpi.com + INSTALL_URL_ADDRESS='https://dietpi.com/downloads/conf/desktop' + G_CHECK_URL "$INSTALL_URL_ADDRESS" + + # - Buster: No leafpad available, use mousepad instead: https://packages.debian.org/search?keywords=leafpad + local editor='leafpad' + (( $G_DISTRO > 4 )) && editor='mousepad' + + G_AGI lxqt qterminal firefox-esr xarchiver lxde-icon-theme upower xscreensaver $editor speedcrunch + + fi + + software_id=24 # Desktop MATE if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3250,8 +3256,7 @@ _EOF_ fi - #Desktop GNUStep - software_id=26 + software_id=26 # Desktop GNUStep if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3264,8 +3269,7 @@ _EOF_ fi - #DESKTOP_XFCE - software_id=25 + software_id=25 # Desktop Xfce if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3278,8 +3282,23 @@ _EOF_ fi - #XRDP - software_id=29 + software_id=174 # GIMP + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then + + Banner_Installing + G_AGI gimp + + fi + + software_id=175 # XFCE4 Power + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then + + Banner_Installing + G_AGI xfce4-power-manager + + fi + + software_id=29 # XRDP if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3287,8 +3306,7 @@ _EOF_ fi - #NOMACHINE - software_id=30 + software_id=30 # NoMachine if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3296,8 +3314,7 @@ _EOF_ fi - #BitTorrent Transmission - software_id=44 + software_id=44 # BitTorrent Transmission if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3305,8 +3322,7 @@ _EOF_ fi - #ProFTPd - software_id=94 + software_id=94 # ProFTPd if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3316,15 +3332,14 @@ _EOF_ fi - #Samba Server - software_id=96 + software_id=96 # Samba Server if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing # Link disk cache to RAM: https://github.com/MichaIng/DietPi/issues/2396 # - Remove previous disk cache dir or symlink - [[ -e /var/cache/samba ]] && rm -R /var/cache/samba + [[ -d '/var/cache/samba' || -L '/var/cache/samba' ]] && rm -R /var/cache/samba # - Pre-create RAM cache dir mkdir -p /var/run/samba-cache # - Link disk cache to RAM @@ -3430,23 +3445,11 @@ _EOF_ local package_list='mariadb-server' # Install php-mysql module, if PHP was already installed - if (( ${aSOFTWARE_INSTALL_STATE[89]} == 2 )); then - - if (( $G_DISTRO < 4 )); then - # For <= Jessie, php5-mysqlnd provides the newer mysql client libraries compared to php5-mysql. - package_list+=' php5-mysqlnd' - - else - # For >= Stretch, php(7.X)-mysqlnd does not exist, thus php-mysql need to be installed: https://packages.debian.org/de/stretch/php-mysql - package_list+=" $PHP_APT_PACKAGE_NAME-mysql" - - fi - - fi + (( ${aSOFTWARE_INSTALL_STATE[89]} == 2 )) && package_list+=" $PHP_NAME-mysql" G_AGI "$package_list" # - Remove mysql.service as we use mariadb.service, both cannot exist: https://github.com/MichaIng/DietPi/issues/1913#issuecomment-441343798 - if [[ -f /etc/init.d/mysql ]] && (( $G_DISTRO >= 4 )); then + if [[ -f '/etc/init.d/mysql' ]] && (( $G_DISTRO > 3 )); then G_DIETPI-NOTIFY 2 'Switching from /etc/init.d/mysql to mariadb.service' systemctl stop mysql @@ -3464,7 +3467,7 @@ _EOF_ Banner_Installing local package_list='sqlite3' # Install php-sqlite module, if PHP was already installed - (( ${aSOFTWARE_INSTALL_STATE[89]} == 2 )) && package_list+=" $PHP_APT_PACKAGE_NAME-sqlite*" + (( ${aSOFTWARE_INSTALL_STATE[89]} == 2 )) && package_list+=" $PHP_NAME-sqlite3" G_AGI "$package_list" fi @@ -3476,9 +3479,22 @@ _EOF_ Banner_Installing local package_list='redis-server' # Install php-redis module, if PHP was already installed - (( ${aSOFTWARE_INSTALL_STATE[89]} == 2 )) && package_list+=" $PHP_BINARY-redis" + (( ${aSOFTWARE_INSTALL_STATE[89]} == 2 )) && package_list+=" $PHP_NAME-redis" G_AGI $package_list + # Fix wrong permissions from Jessie package: https://github.com/MichaIng/DietPi/issues/2736 + # - /var/run/redis is created but on boot as well with wrong root:root permissions, so we need to fix that via ExecStartPre + if (( $G_DISTRO < 4 )); then + + mkdir -p /etc/systemd/system/redis-server.service.d + echo "[Service] +PermissionsStartOnly=true +ExecStartPre=$(command -v mkdir) -p /var/run/redis /var/lib/redis +ExecStartPre=$(command -v chown) -R redis:redis /var/run/redis /var/lib/redis" > /etc/systemd/system/redis-server.service.d/dietpi-fix_permissions.conf + systemctl daemon-reload + + fi + fi #WEBSERVER_PHP @@ -3487,53 +3503,79 @@ _EOF_ Banner_Installing - # Install base PHP packages/modules - # - Apache - if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then + # Jessie + Stretch: Add Ondrejs PHP repository for latest PHP version (currently PHP7.3) + if (( $G_DISTRO < 5 )); then - local package_list="libapache2-mod-$PHP_APT_PACKAGE_NAME" + # Jessie: https://github.com/MichaIng/DietPi/issues/1620#issuecomment-373086888 + if (( $G_DISTRO < 4 )); then - # - Lighttpd or Nginx - elif (( ${aSOFTWARE_INSTALL_STATE[84]} >= 1 || ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then + INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/libssl1.1_1.1.0f-3+deb9u1_' - local package_list="$PHP_APT_PACKAGE_NAME-fpm" + # - ARMv7 + if (( $G_HW_ARCH < 3 )); then - # - No webserver, /usr/bin/php cmd usage - else + INSTALL_URL_ADDRESS+='armhf.deb' - local package_list="$PHP_APT_PACKAGE_NAME-cli" + # - ARM64 + elif (( $G_HW_ARCH == 3 )); then - fi + INSTALL_URL_ADDRESS+='arm64.deb' - # php-common modules, used by most web software - package_list+=" $PHP_APT_PACKAGE_NAME-curl $PHP_APT_PACKAGE_NAME-gd $PHP_BINARY-apcu" + # - x86_64 + elif (( $G_HW_ARCH == 10 )); then - # + Stretch extras - (( $G_DISTRO > 3 )) && package_list+=" $PHP_APT_PACKAGE_NAME-mbstring $PHP_APT_PACKAGE_NAME-opcache $PHP_APT_PACKAGE_NAME-zip $PHP_APT_PACKAGE_NAME-xml" + INSTALL_URL_ADDRESS+='amd64.deb' - # PHP7.2/Buster dropped support for mcrypt: https://liorkaplan.wordpress.com/2017/09/10/php-7-2-is-coming-mcrypt-extension-isnt/ - (( $G_DISTRO < 5 )) && package_list+=" $PHP_APT_PACKAGE_NAME-mcrypt" + fi - # MySQL/MariaDB php module - if (( ${aSOFTWARE_INSTALL_STATE[88]} >= 1 )); then + Download_Install "$INSTALL_URL_ADDRESS" - if (( $G_DISTRO < 4 )); then - # For <= Jessie, php5-mysqlnd provides the newer mysql client libraries compared to php5-mysql. - package_list+=' php5-mysqlnd' + fi - else - # For >= Stretch, php(7.X)-mysqlnd does not exist, thus php-mysql need to be installed: https://packages.debian.org/de/stretch/php-mysql - package_list+=" $PHP_APT_PACKAGE_NAME-mysql" + # - Check URL + INSTALL_URL_ADDRESS='https://packages.sury.org/php/apt.gpg' + G_CHECK_URL "$INSTALL_URL_ADDRESS" + # - APT key + curl -sSL "$INSTALL_URL_ADDRESS" | apt-key add - + # - APT source + echo "deb https://packages.sury.org/php/ $G_DISTRO_NAME main" > /etc/apt/sources.list.d/dietpi-php.list + # - Pin down libssl1.1 version from this repo on Jessie and Stretch: https://github.com/MichaIng/DietPi/issues/2734 + echo -e '# libssl1.1 from sury.org breaks Lighttpd install +Package: openssl libssl1.1\nPin: origin packages.sury.org\nPin-Priority: -1' > /etc/apt/preferences.d/dietpi-openssl + # - APT list update + G_AGUP - fi + fi + + # Base PHP modules + # - Apache + if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then + + local package_list="libapache2-mod-$PHP_NAME" + + # - Lighttpd or Nginx + elif (( ${aSOFTWARE_INSTALL_STATE[84]} > 0 || ${aSOFTWARE_INSTALL_STATE[85]} > 0 )); then + + local package_list="$PHP_NAME-fpm" + + # - No webserver, /usr/bin/php cmd usage + else + + local package_list="$PHP_NAME-cli" fi - # SQLite php module - (( ${aSOFTWARE_INSTALL_STATE[87]} >= 1 )) && package_list+=" $PHP_APT_PACKAGE_NAME-sqlite*" # Wildcard for version (eg:3) + # Additional PHP modules, commonly used by most web applications + package_list+=" $PHP_NAME-apcu $PHP_NAME-curl $PHP_NAME-gd $PHP_NAME-mbstring $PHP_NAME-xml $PHP_NAME-zip" + + # MySQL/MariaDB PHP module + (( ${aSOFTWARE_INSTALL_STATE[88]} > 0 )) && package_list+=" $PHP_NAME-mysql" - # Redis php module - (( ${aSOFTWARE_INSTALL_STATE[91]} >= 1 )) && package_list+=" $PHP_BINARY-redis" + # SQLite PHP module + (( ${aSOFTWARE_INSTALL_STATE[87]} > 0 )) && package_list+=" $PHP_NAME-sqlite3" + + # Redis PHP module + (( ${aSOFTWARE_INSTALL_STATE[91]} > 0 )) && package_list+=" $PHP_NAME-redis" G_AGI $package_list @@ -3575,13 +3617,12 @@ We work around this error by running APT a second time. Please do not worry and fi - #MPD - software_id=128 + software_id=128 # MPD if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - #Jessie- + # Jessie- if (( $G_DISTRO < 4 )); then # MPD not available in Jessie repo for ARMv8 @@ -3597,7 +3638,7 @@ We work around this error by running APT a second time. Please do not worry and fi - #Stretch + # Stretch elif (( $G_DISTRO == 4 )); then DEPS_LIST='libnfs8 libsmbclient libsqlite3-0 libupnp6 libwrap0 libmpdclient2 libflac8 libyajl2 libavahi-client3 libvorbisfile3 libwavpack1 libmad0 libmpg123-0 libopus0 libavformat57 libfaad2 libcdio-paranoia1 libiso9660-8 libshout3 libid3tag0' @@ -3605,11 +3646,11 @@ We work around this error by running APT a second time. Please do not worry and # Prevent APT repo updates from overwriting apt-mark hold mpd - #Buster+ + # Buster+ else # libcdio-paranoia1, libiso9660-8 and libupnp6 not available, but ibcdio-paranoia2, libiso9660-11 and libupnp13 instead - # Buster repo version >= 0.21.4, thus stay with APT for now: + # Buster repo version >= 0.21.5, thus stay with APT for now: G_AGI mpd fi @@ -3636,27 +3677,25 @@ We work around this error by running APT a second time. Please do not worry and fi - #OPENBAZAAR - software_id=58 + software_id=58 # OpenBazaar if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - # - Install go - # x86_64 + # - x86_64 if (( $G_HW_ARCH == 10 )); then - INSTALL_URL_ADDRESS='https://dl.google.com/go/go1.11.2.linux-amd64.tar.gz' + INSTALL_URL_ADDRESS='https://dl.google.com/go/go1.11.9.linux-amd64.tar.gz' - # ARMv8 + # - ARMv8 elif (( $G_HW_ARCH == 3 )); then - INSTALL_URL_ADDRESS='https://dl.google.com/go/go1.11.2.linux-arm64.tar.gz' + INSTALL_URL_ADDRESS='https://dl.google.com/go/go1.11.9.linux-arm64.tar.gz' - # ARMv6/7 + # - ARMv6/7 else - INSTALL_URL_ADDRESS='https://dl.google.com/go/go1.11.2.linux-armv6l.tar.gz' + INSTALL_URL_ADDRESS='https://dl.google.com/go/go1.11.9.linux-armv6l.tar.gz' fi @@ -3682,7 +3721,7 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - Download_Install 'http://yacy.net/release/yacy_v1.92_20161226_9000.tar.gz' /etc + Download_Install 'https://yacy.net/release/yacy_v1.92_20161226_9000.tar.gz' /etc fi @@ -3713,12 +3752,11 @@ _EOF_ fi - #ownCloud - software_id=47 + software_id=47 # ownCloud if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - DEPS_LIST="$PHP_APT_PACKAGE_NAME-intl" # https://doc.owncloud.org/server/administration_manual/installation/manual_installation.html#php-extensions + DEPS_LIST="$PHP_NAME-intl" # https://doc.owncloud.org/server/administration_manual/installation/manual_installation.html#php-extensions if [[ -f /var/www/owncloud/occ ]]; then @@ -3749,12 +3787,11 @@ _EOF_ fi - #Nextcloud - software_id=114 + software_id=114 # Nextcloud if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - DEPS_LIST="$PHP_APT_PACKAGE_NAME-intl" # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation + DEPS_LIST="$PHP_NAME-intl" # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation if [[ -f /var/www/nextcloud/occ ]]; then @@ -3771,11 +3808,6 @@ _EOF_ # Correct config.php data directory entry, in case it changed due to server migration: G_CONFIG_INJECT "'datadirectory'" "'datadirectory' => '$datadir'," /var/www/nextcloud/config/config.php "'dbtype'" - elif (( $G_DISTRO < 4 )); then - - G_DIETPI-NOTIFY 2 'PHP5 support was dropped with NC14, latest NC13 will be installed instead' - Download_Install 'https://download.nextcloud.com/server/releases/latest-13.tar.bz2' /var/www - else Download_Install 'https://download.nextcloud.com/server/releases/latest.tar.bz2' /var/www @@ -3790,13 +3822,12 @@ _EOF_ fi - #Nextcloud Talk - software_id=168 + software_id=168 # Nextcloud Talk if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - # Install "coturn" TURN server only, install Nextcloud Talk app after Nextcloud has been fully configured + # Install coTURN server only, install Nextcloud Talk app after Nextcloud has been fully configured G_AGI coturn fi @@ -3893,68 +3924,59 @@ _EOF_ fi - #Roon Bridge - software_id=121 + software_id=121 # Roon Bridge if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - #x86_64 + # x86_64 if (( $G_HW_ARCH == 10 )); then - INSTALL_URL_ADDRESS='http://download.roonlabs.com/builds/RoonBridge_linuxx64.tar.bz2' + INSTALL_URL_ADDRESS='https://download.roonlabs.com/builds/RoonBridge_linuxx64.tar.bz2' - #ARMv8 + # ARMv8 elif (( $G_HW_ARCH == 3 )); then - INSTALL_URL_ADDRESS='http://download.roonlabs.com/builds/RoonBridge_linuxarmv8.tar.bz2' + INSTALL_URL_ADDRESS='https://download.roonlabs.com/builds/RoonBridge_linuxarmv8.tar.bz2' - #ARMv7 + # ARMv7 else - INSTALL_URL_ADDRESS='http://download.roonlabs.com/builds/RoonBridge_linuxarmv7hf.tar.bz2' + INSTALL_URL_ADDRESS='https://download.roonlabs.com/builds/RoonBridge_linuxarmv7hf.tar.bz2' fi Download_Install "$INSTALL_URL_ADDRESS" - # - reinstall, clear dir, prevent mv fail on non-empty dir - rm -R /etc/roonbridge &> /dev/null - - mkdir -p /etc/roonbridge - mv RoonBridge/* /etc/roonbridge - rm -R RoonBridge + # Clear dir on reinstall + [[ -d '/etc/roonbridge' ]] && rm -R /etc/roonbridge + mv RoonBridge /etc/roonbridge fi - #CAVA - software_id=119 + software_id=119 # CAVA if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - # - armv6 + # armv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/cava_0.6.1-1_armv6.deb' - # - armv7 + # armv7 elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/cava_0.6.1-1_armv7.deb' - # - arm64 + # arm64 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/cava_0.6.1-1_arm64.deb' # Using older binary for Odroid C2 due to: https://github.com/MichaIng/DietPi/issues/1340#issuecomment-393225267 - if (( $G_HW_MODEL == 12 )); then + (( $G_HW_MODEL == 12 )) && INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/cava_0.4.2_arm64.deb' - INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/cava_0.4.2_arm64.deb' - - fi - - # - x86_64 + # x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/cava_0.6.1-1_amd64.deb' @@ -3968,8 +3990,7 @@ _EOF_ fi - #Mopidy - software_id=118 + software_id=118 # Mopidy if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -3981,7 +4002,7 @@ _EOF_ # - This needs to be done prior to APT install, since this would otherwise install a default config file as well. [[ -f /etc/mopidy/mopidy.conf ]] || dps_index=$software_id Download_Install 'mopidy.conf' /etc/mopidy/mopidy.conf - wget -q -O - "$INSTALL_URL_ADDRESS" | apt-key add - + curl -sSL "$INSTALL_URL_ADDRESS" | apt-key add - # No Buster list available yet, use stretch.list for testing: if (( $G_DISTRO > 3 )); then @@ -3995,43 +4016,41 @@ _EOF_ G_AGUP G_AGI mopidy gstreamer1.0-alsa - #ARMv8 - #NB: No ARM64 packages currently exist in mopidy repo. So it will throw a minor error when updating apt. - #Mopidy web client extensions not loading in webpage... - # if (( $G_HW_ARCH == 3 )); then + # ARMv8 + # NB: No ARM64 packages currently exist in mopidy repo. So it will throw a minor error when updating apt. + # Mopidy web client extensions not loading in webpage... + #if (( $G_HW_ARCH == 3 )); then - # G_AGI build-essential python-dev - # pip install mopidy #no effect, claims already upto date. + #G_AGI build-essential python-dev + #pip install mopidy #no effect, claims already upto date. - # fi + #fi pip install Mopidy-MusicBox-Webclient Mopidy-Local-Images fi - #Kodi - software_id=31 + software_id=31 # Kodi if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - #Odroids - if (( $G_HW_MODEL >= 10 )) && (( $G_HW_MODEL < 20 )); then + # Odroids + if (( $G_HW_MODEL > 9 )) && (( $G_HW_MODEL < 20 )); then local package_list='kodi-odroid' - #XU4 - requires pulse audio (fixes corrupt sound) - if (( $G_HW_MODEL == 11 )); then - - package_list+=' pulseaudio' + # - XU4: Requires pulse audio (fixes corrupt sound) + (( $G_HW_MODEL == 11 )) && package_list+=' pulseaudio' - fi - - #Everything else + # Everything else else local package_list='kodi' + # - RPi: Kodi 18 requires fbset to start with custom screen resolution: https://dietpi.com/phpbb/viewtopic.php?p=17550#p17550 + (( $G_HW_MODEL < 10 )) && package_list+=' fbset' + fi # - libcurl3-gnutls required for C2. But lets apply to all: https://github.com/MichaIng/DietPi/issues/446 @@ -4065,30 +4084,28 @@ _EOF_ fi - #NoIp - software_id=67 + software_id=67 # No-IP if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - #x86_x64 + # x86_x64 if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/noip_x32_x64.zip' - #ARMv8 + # ARMv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/noip_arm64.zip' - #ARMv6/7 + # ARMv6/7 else INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/noip_armhf.zip' fi - #NoIp binary install Download_Install "$INSTALL_URL_ADDRESS" mkdir -p /usr/local/bin @@ -4097,13 +4114,12 @@ _EOF_ fi - #amiberry - software_id=108 + software_id=108 # Amiberry if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - # - Backup existing autostart.uae for user + # Backup existing autostart.uae for user G_BACKUP_FP $G_FP_DIETPI_USERDATA/amiberry/conf/autostart.uae DEPS_LIST='libmpg123-0 libxml2 mpeg2dec libmpeg2-4 libsndio6.1' @@ -4172,15 +4188,24 @@ _EOF_ fi - #OpenTyrian - software_id=51 + software_id=51 # OpenTyrian if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - DEPS_LIST='ibsdl1.2debian libsdl-net1.2' - Download_Install 'https://dietpi.com/downloads/binaries/rpi/opentyrian_armhf.zip' / - chmod +x /usr/local/games/opentyrian/opentyrian + if (( $G_HW_MODEL >= 10 )); then + + G_AGI opentyrian + + else + + DEPS_LIST='ibsdl1.2debian libsdl-net1.2' + Download_Install 'https://dietpi.com/downloads/binaries/rpi/opentyrian_armhf.zip' / + cp -R /usr/local/games/opentyrian /usr/games/ #cp 'just does it', mv will fail if already exists. + rm -R /usr/local/games/opentyrian + chmod +x /usr/games/opentyrian/opentyrian + + fi fi @@ -4195,30 +4220,30 @@ _EOF_ cd RPi_Cam* - #Config /etc/motion + # Config /etc/motion mkdir -p /etc/motion cp etc/motion/motion.conf.1 /etc/motion/motion.conf - #Config /etc/raspimjpeg + # Config /etc/raspimjpeg cp etc/raspimjpeg/raspimjpeg.1 /etc/raspimjpeg - #Setup /var/www/rpicam + # Setup /var/www/rpicam mkdir -p /var/www/rpicam/media cp -R www/* /var/www/rpicam/ #chmod +x /var/www/rpicam/raspizip.sh mknod /var/www/rpicam/FIFO p mknod /var/www/rpicam/FIFO1 p - #symlink cam preview and status + # Symlink cam preview and status ln -sf /run/shm/mjpeg/cam.jpg /var/www/rpicam/cam.jpg ln -sf /run/shm/mjpeg/status_mjpeg.txt /var/www/rpicam/status_mjpeg.txt - #Setup Raspimjpeg binary + # Setup Raspimjpeg binary cp bin/raspimjpeg /opt/vc/bin/raspimjpeg chmod +x /opt/vc/bin/raspimjpeg ln -s /opt/vc/bin/raspimjpeg /usr/bin/raspimjpeg - #Cleanup / remove extracted source + # Cleanup / remove extracted source cd /tmp/$G_PROGRAM_NAME rm -R RPi_Cam* @@ -4232,8 +4257,7 @@ _EOF_ fi - #WEBMIN - software_id=115 + software_id=115 # Webmin if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -4243,13 +4267,12 @@ _EOF_ fi - #O!MPD - software_id=129 + software_id=129 # O!MPD if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - # Download_Install 'https://github.com/ArturSierzant/OMPD/archive/master.zip' /var/www + #Download_Install 'https://github.com/ArturSierzant/OMPD/archive/master.zip' /var/www Download_Install 'https://github.com/ArturSierzant/OMPD/archive/2a2909be2d7abc8cce7dff741f529c7d876d4094.zip' /var/www rm -R /var/www/ompd &> /dev/null #Replace/upgrade existing installs @@ -4257,8 +4280,7 @@ _EOF_ fi - #IceCast + DarkIce - software_id=135 + software_id=135 # IceCast + DarkIce if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -4266,8 +4288,7 @@ _EOF_ fi - #LINUXDASH - software_id=63 + software_id=63 # LinuxDash if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -4284,24 +4305,24 @@ _EOF_ Banner_Installing - INSTALL_URL_ADDRESS='http://install.pi-hole.net' + INSTALL_URL_ADDRESS='https://install.pi-hole.net' G_CHECK_URL "$INSTALL_URL_ADDRESS" - # - Check free available memory. Increase swapfile size to prevent gravity running out of mem. + # Check free available memory. Increase swapfile size to prevent gravity running out of mem. if (( $(free -m | mawk '/Mem:/ {print $4;exit}') < 512 && $(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') < 512 )); then G_DIETPI-NOTIFY 2 'Increasing swapfile size to 512MB before running gravity.sh, please wait...\n' - /DietPi/dietpi/func/dietpi-set_dphys-swapfile 512 + /DietPi/dietpi/func/dietpi-set_swapfile 512 fi - # - Install + # Install wget "$INSTALL_URL_ADDRESS" -O install.sh chmod +x install.sh - # Skip Lighttpd install, since user properly has chosen a different one, which was installed as pre-req. + # - Skip Lighttpd install, since user properly has chosen a different one, which was installed as pre-req. ./install.sh --disable-install-webserver - # We can't do reasonable exit code check, since installer always returns 5! + # - We can't do reasonable exit code check, since installer always returns 5! rm install.sh fi @@ -4325,8 +4346,8 @@ _EOF_ Banner_Installing - #G_AGI lame #conflicts with our ffmpeg package: https://github.com/MichaIng/DietPi/issues/946#issuecomment-300738228 - Download_Install 'https://dietpi.com/downloads/binaries/all/subsonic-6.1.3.deb' + #DEPS_LIST='lame' # Conflicts with our ffmpeg package: https://github.com/MichaIng/DietPi/issues/946#issuecomment-300738228 + Download_Install 'https://dietpi.com/downloads/binaries/all/subsonic.deb' fi @@ -4378,7 +4399,7 @@ _EOF_ # - RPi if (( $G_HW_MODEL < 10 )); then - # http://git.drogon.net/?p=wiringPi;a=shortlog;h=refs/heads/master snapshot + # https://git.drogon.net/?p=wiringPi;a=shortlog;h=refs/heads/master snapshot Download_Install 'https://dietpi.com/downloads/binaries/all/wiringPi-8d188fa.tar.gz' # - Odroid's @@ -4439,8 +4460,7 @@ _EOF_ fi - #Blynk Server - software_id=131 + software_id=131 # Blynk Server if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -4452,7 +4472,7 @@ _EOF_ mkdir -p $G_FP_DIETPI_USERDATA/blynk/data G_THREAD_START wget "$INSTALL_URL_ADDRESS" -O $G_FP_DIETPI_USERDATA/blynk/blynkserver.jar - # - Install Blynk JS Libary + # Install Blynk JS libary G_AGI python npm i -g --unsafe-perm onoff npm i -g --unsafe-perm blynk-library @@ -4470,10 +4490,10 @@ _EOF_ # - Skip license for NAA daemon: debconf-set-selections <<< 'networkaudiod networkaudiod/license note false' - #Packages + # Packages local apackages=() - # Jessie - requires stretch packages + # - Jessie - requires stretch packages if (( $G_DISTRO == 3 )); then apackages+=('https://dietpi.com/downloads/binaries/all/gcc-6-base_6.3.0-6_armhf.deb') @@ -4498,7 +4518,7 @@ _EOF_ fi - # - check online + # - Check online for ((i=0; i<${#apackages[@]}; i++)) do @@ -4509,12 +4529,8 @@ _EOF_ # - Prereqs DEPS_LIST='libasound2' - # - Stretch, install additional packages - if (( $G_DISTRO >= 4 )); then - - DEPS_LIST+=' gcc-6-base libstdc++6' - - fi + # - Stretch+ additional packages + (( $G_DISTRO > 3 )) && DEPS_LIST+=' gcc-6-base libstdc++6' for ((i=0; i<${#apackages[@]}; i++)) do @@ -4525,8 +4541,8 @@ _EOF_ unset apackages - #Enable logging for NAA Daemon - #echo -e "NETWORKAUDIOD_LOGFILE='/var/log/naadaemon.log'" > /etc/default/networkaudiod + # Enable logging for NAA Daemon + #echo "NETWORKAUDIOD_LOGFILE='/var/log/naadaemon.log'" > /etc/default/networkaudiod fi @@ -4550,16 +4566,15 @@ _EOF_ cd WebIOPi* - #Automate Weaved prompt + # Automate Weaved prompt sed -i '/read response/c\response="n"' setup.sh - #Run setup script + # Run setup script ./setup.sh - printf '\ec' # clear current terminal screen cd /tmp/$G_PROGRAM_NAME - #Cleanup + # Cleanup rm -R WebIOPi* fi @@ -4587,58 +4602,41 @@ _EOF_ cd haproxy-* - #Compile and install + # Compile and install make -j $G_HW_CPU_CORES TARGET=linux2628 CPU=generic USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_LINUX_SPLICE=1 make install mkdir /etc/haproxy - #Exit directory + # Exit directory cd /tmp/$G_PROGRAM_NAME - #Clean up + # Clean up rm -R haproxy-* - #Install init script as service + # Install init script as service dps_index=$software_id Download_Install 'haproxy.service' /etc/init.d/haproxy chmod +x /etc/init.d/haproxy update-rc.d haproxy defaults fi - #SQUEEZEBOXSERVER - software_id=35 + software_id=35 # Logitech Media Server if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - # - ARMv8 under ARMv6/7 - if (( $G_HW_ARCH == 3 )); then + # Instructions: http://wiki.slimdevices.com/index.php/DebianPackage#installing_7.9.2 + # - Grab architecture + local arch='arm' + (( $G_HW_ARCH == 10 )) && arch='amd64' - dpkg --add-architecture armhf - G_AGUP - - fi - - Download_Install 'https://dietpi.com/downloads/binaries/all/logitechmediaserver_7.9.1_all.deb' - - # - ARMv8, CPAN - if (( $G_HW_ARCH == 3 )); then - - if (( $G_DISTRO == 3 )); then - - INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/DietPi-LMS7.9-CPAN_arm64.zip' - - else - - INSTALL_URL_ADDRESS='https://dietpi.com/downloads/binaries/all/logitechmediaserver_7.9.1_CPAN-armv8-stretch.zip' - - fi - - DEPS_LIST='libxml-parser-perl zlib1g-dev libjpeg-dev libpng-dev libjpeg62-turbo-dev' # shared libs needed for Image::Scale@0.08 - Download_Install "$INSTALL_URL_ADDRESS" /usr/share/squeezeboxserver + # - Grab URL for the latest package (nightly) + INSTALL_URL_ADDRESS="https://www.mysqueezebox.com/update/?version=7.9.2&revision=1&geturl=1&os=deb$arch" + G_CHECK_URL "$INSTALL_URL_ADDRESS" - fi + # - Install, failsafe checking this URL again + Download_Install "$(curl -s "$INSTALL_URL_ADDRESS")" fi @@ -4658,8 +4656,8 @@ _EOF_ Banner_Installing # Install required PHP modules: https://github.com/FreshRSS/FreshRSS#example-of-full-installation-on-linux-debianubuntu - DEPS_LIST="$PHP_APT_PACKAGE_NAME-curl $PHP_APT_PACKAGE_NAME-gmp $PHP_APT_PACKAGE_NAME-intl $PHP_APT_PACKAGE_NAME-json" - (( $G_DISTRO > 3 )) && DEPS_LIST+=" $PHP_APT_PACKAGE_NAME-mbstring $PHP_APT_PACKAGE_NAME-xml $PHP_APT_PACKAGE_NAME-zip" + DEPS_LIST="$PHP_NAME-curl $PHP_NAME-gmp $PHP_NAME-intl $PHP_NAME-json" + (( $G_DISTRO > 3 )) && DEPS_LIST+=" $PHP_NAME-mbstring $PHP_NAME-xml $PHP_NAME-zip" Download_Install 'https://github.com/FreshRSS/FreshRSS/archive/master.zip' /opt mv /opt/FreshRSS-master /opt/FreshRSS @@ -4705,20 +4703,50 @@ _EOF_ fi - #FAIL2BAN - software_id=73 + software_id=73 # Fail2Ban if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - >> /var/log/auth.log #: https://github.com/MichaIng/DietPi/issues/475#issuecomment-310873879 + # Create jail.conf (backend = systemd) first, to prevent APT failure due to missing /var/log/auth.log: https://github.com/MichaIng/DietPi/issues/475#issuecomment-310873879 + mkdir -p /etc/fail2ban + [[ -f '/etc/fail2ban/jail.conf' ]] || cat << _EOF_ > /etc/fail2ban/jail.conf +[DEFAULT] +ignoreip = 127.0.0.1/8 +ignorecommand = +bantime = 600 +findtime = 600 +maxretry = 3 +backend = systemd +enabled = true +filter = %(__name__)s +port = 0:65535 +banaction = route +action_ = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s"] +action = %(action_)s + +[sshd] +port = ssh + +[dropbear] +port = ssh +_EOF_ + + if (( $G_DISTRO > 3 )); then + + G_AGI python3-systemd fail2ban - G_AGI python3-systemd fail2ban + # On Jessie, the systemd backend is not yet supported, so we install the Stretch package manually + else + + DEPS_LIST='python3-systemd' + Download_Install 'https://dietpi.com/downloads/binaries/all/fail2ban.deb' + + fi fi - #InfluxDB - software_id=74 + software_id=74 # InfluxDB if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -4726,7 +4754,7 @@ _EOF_ INSTALL_URL_ADDRESS='https://repos.influxdata.com/influxdb.key' G_CHECK_URL "$INSTALL_URL_ADDRESS" - curl -sL "$INSTALL_URL_ADDRESS" | apt-key add - + curl -sSL "$INSTALL_URL_ADDRESS" | apt-key add - echo "deb https://repos.influxdata.com/debian $G_DISTRO_NAME stable" > /etc/apt/sources.list.d/influxdb.list G_AGUP @@ -4734,8 +4762,7 @@ _EOF_ fi - #Grafana - software_id=77 + software_id=77 # Grafana if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -4751,7 +4778,7 @@ _EOF_ fi G_CHECK_URL "$INSTALL_URL_ADDRESS" - curl -sL "$INSTALL_URL_ADDRESS" | apt-key add - + curl -sSL "$INSTALL_URL_ADDRESS" | apt-key add - # APT repo source & update echo "$deb_address" > /etc/apt/sources.list.d/grafana.list @@ -4911,7 +4938,7 @@ _EOF_ fi # Odroids need to purge before we install, else, does not update to latest version... - (( $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 )) && G_AGP $kernel_packages + (( $G_HW_MODEL > 9 && $G_HW_MODEL < 20 )) && G_AGP $kernel_packages # Since G_AGUG does not upgrade packages with changed dependencies, in case of kernel image meta packages, those need to be installed+upgraded via G_AGI. G_AGI $kernel_packages # apt-get install overrides hold state @@ -4921,7 +4948,7 @@ _EOF_ # - Disable sid repo via priority "-1", to prevent any accidental package upgrades: https://github.com/MichaIng/DietPi/issues/2568 # - Enable but set sid WireGuard package priorities low enough to install only if not available in main repo(s) echo -e 'Package: *\nPin: release n=sid\nPin-Priority: -1\n -Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Priority: 99' > /etc/apt/preferences.d/dietpi-wireguard +Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Priority: 100' > /etc/apt/preferences.d/dietpi-wireguard # RPi: Install debian-archive-keyring, currently version 2018.1 from sid branch: https://packages.debian.org/de/sid/debian-archive-keyring (( $G_HW_MODEL < 10 )) && Download_Install 'https://dietpi.com/downloads/binaries/rpi/debian-archive-keyring.deb' @@ -4995,11 +5022,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #TORHOTSPOT requires WIFIHOTSPOT: - (( ${aSOFTWARE_INSTALL_STATE[61]} == 1 )) && aSOFTWARE_INSTALL_STATE[60]=1 - - #WIFIHOTSPOT - software_id=60 + software_id=60 # WiFi Hotspot if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -5014,7 +5037,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #Which binary to install + # Which binary to install local filename_hostapd='' local filename_hostapd_cli='' @@ -5049,19 +5072,15 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior rm hostapd-* - #Enable wifi modules + # Enable wifi modules /DietPi/dietpi/func/dietpi-set_hardware wifimodules enable fi - - #TORHOTSPOT - software_id=61 + software_id=61 # Tor Hotspot if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - - # - Prereqs G_AGI tor fi @@ -5088,10 +5107,10 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior Banner_Installing # Install required PHP modules - DEPS_LIST="$PHP_BINARY-apcu $PHP_APT_PACKAGE_NAME-gd $PHP_APT_PACKAGE_NAME-intl" + DEPS_LIST="$PHP_NAME-apcu $PHP_NAME-gd $PHP_NAME-intl" # - Stretch extras - (( $G_DISTRO > 3 )) && DEPS_LIST+=" $PHP_APT_PACKAGE_NAME-mbstring $PHP_APT_PACKAGE_NAME-opcache $PHP_APT_PACKAGE_NAME-xml" + (( $G_DISTRO > 3 )) && DEPS_LIST+=" $PHP_NAME-mbstring $PHP_NAME-opcache $PHP_NAME-xml" # Skip install, if already present if [[ -d /var/www/pydio ]]; then @@ -5216,8 +5235,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #EMBYSERVER - software_id=41 + software_id=41 # Emby Server if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -5240,6 +5258,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi + local fallback_url="https://github.com/MediaBrowser/Emby.Releases/releases/download/4.0.2.0/emby-server-deb_4.0.2.0_$arch.deb" no_check_url=1 Download_Install "$(curl -s "$INSTALL_URL_ADDRESS" | grep -m1 "browser_download_url.*emby-server-deb_.*_$arch\.deb" | cut -d \" -f 4)" unset arch @@ -5251,27 +5270,19 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior Banner_Installing - # Derive latest version from: https://plex.tv/pms/downloads/5 - INSTALL_URL_ADDRESS='https://plex.tv/pms/downloads/5' + # Apply APT key + INSTALL_URL_ADDRESS='https://downloads.plex.tv/plex-keys/PlexSign.key' G_CHECK_URL "$INSTALL_URL_ADDRESS" + curl -sSL "$INSTALL_URL_ADDRESS" | apt-key add - - # ARMv7 - local arch='armhf' + # Apply APT repo + echo 'deb https://downloads.plex.tv/repo/deb public main' > /etc/apt/sources.list.d/plexmediaserver.list - # ARMv8 - if (( $G_HW_ARCH == 3 )); then - - arch='arm64' - - # x86_64 - elif (( $G_HW_ARCH == 10 )); then - - arch='amd64' - - fi + # Update APT lists + G_AGUP - # Derive URL from arch - no_check_url=1 Download_Install "$(curl -s "$INSTALL_URL_ADDRESS" | grep -m1 "distro=\"debian\".*$arch\.deb" | cut -d \" -f 8)" + # Install PMS + G_AGI plexmediaserver fi @@ -5281,15 +5292,15 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior Banner_Installing - #x86_64 + # x86_64 if (( $G_HW_ARCH == 10 )); then - INSTALL_URL_ADDRESS='http://builds.cuberite.org/job/Cuberite%20Linux%20x64%20Master/lastSuccessfulBuild/artifact/Cuberite.tar.gz' + INSTALL_URL_ADDRESS='https://builds.cuberite.org/job/Cuberite%20Linux%20x64%20Master/lastSuccessfulBuild/artifact/Cuberite.tar.gz' - #32bit ARM + # 32bit ARM elif (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then - INSTALL_URL_ADDRESS='http://builds.cuberite.org/job/Cuberite%20Linux%20raspi-armhf%20Master/lastSuccessfulBuild/artifact/Cuberite.tar.gz' + INSTALL_URL_ADDRESS='https://builds.cuberite.org/job/Cuberite%20Linux%20raspi-armhf%20Master/lastSuccessfulBuild/artifact/Cuberite.tar.gz' fi @@ -5301,8 +5312,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #MINEOS - software_id=53 + software_id=53 # MineOS if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -5553,7 +5563,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior INSTALL_URL_ADDRESS1='https://dietpi.com/downloads/binaries/all/libjpeg8_8d1-2_amd64.deb' (( $G_DISTRO > 3 )) && INSTALL_URL_ADDRESS2='https://dietpi.com/downloads/binaries/all/libpng12-0_1.2.50-2+deb8u3_amd64.deb' || DEPS_LIST+=' libpng12-0' - INSTALL_URL_ADDRESS3='http://www.tonido.com/download.php?tonido64.tar.gz' + INSTALL_URL_ADDRESS3='https://www.tonido.com/download.php?tonido64.tar.gz' fi @@ -5602,7 +5612,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi # - Odroid's, 'apt-get install -f' removes chromium package, rather than install required deps... - if (( $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 )); then + if (( $G_HW_MODEL > 9 && $G_HW_MODEL < 20 )); then DEPS_LIST='libgnome-keyring0 libnspr4 libnss3 libnss3-1d libspeechd2 libxslt1.1 libxss1 xdg-utils libgnome-keyring-common libltdl7' @@ -5645,25 +5655,25 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #CloudPrint - software_id=137 + software_id=137 # CloudPrint if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - if (( $G_DISTRO == 3 )); then #https://github.com/MichaIng/DietPi/issues/855#issuecomment-292712002 - - INSTALL_URL_ADDRESS='http://davesteele.github.io/cloudprint-service' + if (( $G_DISTRO == 3 )); then # https://github.com/MichaIng/DietPi/issues/855#issuecomment-292712002 - #url/redirect fails wget spider test... + # Apply APT key + INSTALL_URL_ADDRESS='https://davesteele.github.io/key-366150CE.pub.txt' G_CHECK_URL "$INSTALL_URL_ADDRESS" + curl -sSL "$INSTALL_URL_ADDRESS" | apt-key add - - INSTALL_URL_ADDRESS+='/repo' + # Apply APT repo + echo 'deb https://davesteele.github.io/cloudprint-service/repo cloudprint-jessie main' > /etc/apt/sources.list.d/cloudprint.list - echo -e "deb $INSTALL_URL_ADDRESS cloudprint-jessie main" > /etc/apt/sources.list.d/cloudprint.list - wget -q -O - https://davesteele.github.io/key-366150CE.pub.txt | apt-key add - + # Update APT lists G_AGUP + # Install CloudPrint G_AGI cloudprint-service else @@ -5674,25 +5684,24 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #VirtualHere - software_id=138 + software_id=138 # VirtualHere if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://virtualhere.com/sites/default/files/usbserver/vhusbd' - #armv6+ + # ARMv6/7 if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='arm' - #ARMv8 + # ARMv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='arm64' - #x86_64 + # x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='x86_64' @@ -5763,8 +5772,8 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior Banner_Installing # Needed PHP modules, (re)install to be failsafe: https://koel.phanan.net/docs/#/?id=server, https://laravel.com/docs/5.6/installation#server-requirements - DEPS_LIST="python $PHP_APT_PACKAGE_NAME-json" - (( $G_DISTRO > 3 )) && DEPS_LIST+=" $PHP_APT_PACKAGE_NAME-mbstring $PHP_APT_PACKAGE_NAME-xml" + DEPS_LIST="python $PHP_NAME-json" + (( $G_DISTRO > 3 )) && DEPS_LIST+=" $PHP_NAME-mbstring $PHP_NAME-xml" Download_Install 'https://github.com/phanan/koel/archive/v3.7.2.zip' mv koel-* $G_FP_DIETPI_USERDATA/koel @@ -5789,23 +5798,22 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #Sonarr - software_id=144 + software_id=144 # Sonarr if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing - #ARMv8 binary install: https://github.com/MichaIng/DietPi/issues/1502 + # ARMv8 binary install: https://github.com/MichaIng/DietPi/issues/1502 if (( $G_HW_ARCH == 3 )); then - Download_Install 'http://update.sonarr.tv/v2/develop/mono/NzbDrone.develop.tar.gz' /opt + Download_Install 'https://update.sonarr.tv/v2/develop/mono/NzbDrone.develop.tar.gz' /opt G_AGI mediainfo - #Repo install + # Repo install else apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC - echo 'deb http://apt.sonarr.tv/ develop main' > /etc/apt/sources.list.d/sonarr.list + echo 'deb https://apt.sonarr.tv/ develop main' > /etc/apt/sources.list.d/sonarr.list G_AGUP G_AGI nzbdrone @@ -5813,14 +5821,13 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #Radarr - software_id=145 + software_id=145 # Radarr if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://api.github.com/repos/Radarr/Radarr/releases' - G_CHECK_URL "$INSTALL_URL_ADDRESS" #full filepath below, returns --spider error :( + G_CHECK_URL "$INSTALL_URL_ADDRESS" # full filepath below, returns --spider error :( INSTALL_URL_ADDRESS=$(curl -s "$INSTALL_URL_ADDRESS" | grep -m1 'browser_download_url.*linux\.tar\.gz' | cut -d \" -f 4) DEPS_LIST='mediainfo' @@ -5828,8 +5835,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #Lidarr - software_id=106 + software_id=106 # Lidarr if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -5843,8 +5849,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #PlexPy - software_id=146 + software_id=146 # PlexPy if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -5961,8 +5966,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi - #RoonServer - software_id=154 + software_id=154 # RoonServer if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -5972,7 +5976,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior # Skip download and install, if already existent, manual removal or internal updater can be used: if [[ ! -d $G_FP_DIETPI_USERDATA/roonserver ]]; then - Download_Install 'http://download.roonlabs.com/builds/RoonServer_linuxx64.tar.bz2' $G_FP_DIETPI_USERDATA + Download_Install 'https://download.roonlabs.com/builds/RoonServer_linuxx64.tar.bz2' $G_FP_DIETPI_USERDATA mv $G_FP_DIETPI_USERDATA/RoonServer $G_FP_DIETPI_USERDATA/roonserver else @@ -5986,8 +5990,7 @@ If you want to update ${aSOFTWARE_WHIP_NAME[$software_id]}, please use it's inte fi - #Steam - software_id=156 + software_id=156 # Steam if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Installing @@ -6071,11 +6074,11 @@ Pin-Priority: -1' > /etc/apt/preferences.d/dietpi-docker_fix if (( $G_HW_ARCH == 10 )); then - INSTALL_URL_ADDRESS='http://FuguHub.com/install/FuguHub.linux.install' + INSTALL_URL_ADDRESS='https://FuguHub.com/install/FuguHub.linux.install' else - INSTALL_URL_ADDRESS='http://FuguHub.com/releases/raspberrypi/install.sh' + INSTALL_URL_ADDRESS='https://FuguHub.com/releases/raspberrypi/install.sh' fi @@ -6085,7 +6088,7 @@ Pin-Priority: -1' > /etc/apt/preferences.d/dietpi-docker_fix chmod +x FHinstall.sh ./FHinstall.sh rm FHinstall.sh - wget http://fuguhub.com/box.zip -O /home/bd/applications/box.zip + wget https://fuguhub.com/box.zip -O /home/bd/applications/box.zip fi @@ -6211,7 +6214,7 @@ Pin-Priority: -1' > /etc/apt/preferences.d/dietpi-docker_fix INSTALL_URL_ADDRESS='https://dtcooper.github.io/raspotify/key.asc' G_CHECK_URL "$INSTALL_URL_ADDRESS" - wget -O - "$INSTALL_URL_ADDRESS" | apt-key add - + curl -sSL "$INSTALL_URL_ADDRESS" | apt-key add - echo 'deb https://dtcooper.github.io/raspotify jessie main' > /etc/apt/sources.list.d/raspotify.list G_AGUP @@ -6750,7 +6753,7 @@ Pin-Priority: -1' > /etc/apt/preferences.d/dietpi-docker_fix Banner_Installing - #RPi + OpenMAX HW Encoding: https://github.com/MichaIng/DietPi/issues/869 + # RPi + OpenMAX HW Encoding: https://github.com/MichaIng/DietPi/issues/869 if (( $G_HW_MODEL < 10 )); then Download_Install 'https://dietpi.com/downloads/binaries/rpi/ffmpeg_rpi.7z' ffmpeg_rpi @@ -6758,7 +6761,7 @@ Pin-Priority: -1' > /etc/apt/preferences.d/dietpi-docker_fix dpkg -i ffmpeg_rpi/*.deb rm -R ffmpeg_rpi - #Everything else + # Everything else else G_AGI ffmpeg @@ -6798,7 +6801,7 @@ _EOF_ Banner_Installing - INSTALL_URL_ADDRESS='http://raw.githubusercontent.com/taaem/nodejs-linux-installer/master/node-install.sh' + INSTALL_URL_ADDRESS='https://raw.githubusercontent.com/taaem/nodejs-linux-installer/master/node-install.sh' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O node_install.sh @@ -7156,8 +7159,7 @@ _EOF_ local software_id=-1 - #DESKTOP_LXDE - software_id=23 + software_id=23 # Desktop LXDE if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -7199,8 +7201,7 @@ _EOF_ fi - #Desktop MATE - software_id=24 + software_id=24 # Desktop MATE if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -7219,17 +7220,30 @@ _EOF_ fi - #Desktop GNUStep - software_id=26 + software_id=173 # Desktop LXQt if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration + + # - Configs + Download_Install "https://github.com/MichaIng/DietPi/raw/$G_GITBRANCH/.conf/desktop/lxqt/lxqt-$G_DISTRO_NAME.7z" /root/.config + # - Disable trash + # Skip on Buster since trash seems to be implemented differently: https://github.com/MichaIng/DietPi/issues/1918#issuecomment-488085982 + (( $G_DISTRO < 5 )) && G_CONFIG_INJECT 'use_trash=' 'use_trash=0' /etc/xdg/libfm/libfm.conf + Create_Desktop_Shared_Items fi - #DESKTOP_XFCE - software_id=25 + software_id=26 # Desktop GNUStep + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then + + Banner_Configuration + Create_Desktop_Shared_Items + + fi + + software_id=25 # Desktop Xfce if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -7243,7 +7257,7 @@ _EOF_ Banner_Configuration - #Apache2 confs + # Apache2 confs G_BACKUP_FP /etc/apache2/apache2.conf dps_index=$software_id Download_Install 'apache2.conf' /etc/apache2/apache2.conf cat << _EOF_ > /etc/apache2/sites-available/000-default.conf @@ -7290,7 +7304,7 @@ _EOF_ _EOF_ - #Use /var/www as default webfolder + # Use /var/www as default webfolder mv /var/www/html/index.html /var/www/index.html &> /dev/null [[ $(ls -A /var/www/html 2>&1) ]] || rm -R /var/www/html @@ -7311,15 +7325,7 @@ _EOF_ G_BACKUP_FP /etc/nginx/nginx.conf dps_index=$software_id Download_Install 'nginx.conf' /etc/nginx/nginx.conf # Adjust socket name to PHP version - if (( $G_DISTRO < 4 )); then - - sed -i 's#/run/php/php7.0-fpm.sock#/run/php5-fpm.sock#g' /etc/nginx/nginx.conf - - elif (( $G_DISTRO > 4 )); then - - sed -i 's#php7.0-fpm.sock#php7.3-fpm.sock#g' /etc/nginx/nginx.conf - - fi + sed -i "s#/run/php/php.*-fpm.sock#/run/php/$PHP_NAME-fpm.sock#g" /etc/nginx/nginx.conf # - CPU core count sed -i "/worker_processes/c\worker_processes $G_HW_CPU_CORES;" /etc/nginx/nginx.conf @@ -7344,18 +7350,15 @@ _EOF_ sed -i '/^server.document-root/c\server.document-root = "/var/www"' /etc/lighttpd/lighttpd.conf #Configure fastcgi for PHP-FPM - local fp_php_fpm_sock="/var/run/php/$PHP_APT_PACKAGE_NAME-fpm.sock" - (( $G_DISTRO < 4 )) && fp_php_fpm_sock='/var/run/php5-fpm.sock' - cat << _EOF_ > /etc/lighttpd/conf-available/15-fastcgi-php.conf # -*- depends: fastcgi -*- # /usr/share/doc/lighttpd/fastcgi.txt.gz -# http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ConfigurationOptions#mod_fastcgi-fastcgi +# https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ConfigurationOptions#mod_fastcgi-fastcgi ## Start an FastCGI server using php-fpm fastcgi.server += ( ".php" => (( - "socket" => "$fp_php_fpm_sock", + "socket" => "/run/php/$PHP_NAME-fpm.sock", "broken-scriptfilename" => "enable" )) ) @@ -7378,15 +7381,15 @@ _EOF_ Banner_Configuration # - Apache2 has its own PHP module - if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then + if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then # https://github.com/MichaIng/DietPi/issues/1144 local php_service='/lib/systemd/system/apache2.service' # - Nginx and Lighttpd use PHP-FPM - elif (( ${aSOFTWARE_INSTALL_STATE[84]} >= 1 || ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then + elif (( ${aSOFTWARE_INSTALL_STATE[84]} > 0 || ${aSOFTWARE_INSTALL_STATE[85]} > 0 )); then - local php_service='/lib/systemd/system/php*-fpm.service' + local php_service="/lib/systemd/system/${PHP_NAME}-fpm.service" # - PHP-FPM confs sed -i '/cgi.fix_pathinfo=/c\cgi.fix_pathinfo=1' "$FP_PHP_BASE_DIR"/fpm/php.ini @@ -7408,70 +7411,59 @@ _EOF_ fi - # PHP cache settings - local target_php_cachesize=$(( $RAM_TOTAL / 30 )) - (( $target_php_cachesize < 10 )) && target_php_cachesize=10 - - # - OPcache - local target_php_ini="$FP_PHP_BASE_DIR/mods-available/opcache.ini" - - G_CONFIG_INJECT 'opcache.enable[[:blank:]]*=' 'opcache.enable=1' $target_php_ini - G_CONFIG_INJECT 'opcache.memory_consumption[[:blank:]]*=' "opcache.memory_consumption=$target_php_cachesize" $target_php_ini - G_CONFIG_INJECT 'opcache.revalidate_freq[[:blank:]]*=' 'opcache.revalidate_freq=60' $target_php_ini - - # - APCu - target_php_ini="$FP_PHP_BASE_DIR/mods-available/apcu.ini" - # - apc.shm_size= requires M at end to prevent warning: https://github.com/MichaIng/DietPi/issues/218 - target_php_cachesize+='M' - # - 3days TTL - local target_apc_ttl='259200' - - G_CONFIG_INJECT 'apc.shm_size[[:blank:]]*=' "apc.shm_size=$target_php_cachesize" $target_php_ini - G_CONFIG_INJECT 'apc.ttl[[:blank:]]*=' "apc.ttl=$target_apc_ttl" $target_php_ini - # We create our own PHP mod to add DietPi specific configs. target_php_ini="$FP_PHP_BASE_DIR/mods-available/dietpi.ini" - echo -e '; DietPi PHP settngs\n; priority=99' > $target_php_ini + echo -e '; DietPi PHP settngs\n; priority=98' > $target_php_ini - # - Set tmp_upload_dir to sd. Can't be /tmp as its ramdisk and limited size. Also used by ownCloud/Nextcloud uploads + # - Set upload_tmp_dir to disk. Can't be /tmp as its ramdisk and limited size. Also used by ownCloud/Nextcloud uploads # - If PHP uses PrivateTmp, we must not use own subfolder: https://github.com/MichaIng/DietPi/issues/1144 if [[ -f $php_service ]] && grep -q '^[[:blank:]]*PrivateTmp=true' $php_service; then - local tmp_upload_dir='/var/tmp' + local upload_tmp_dir='/var/tmp' else - local tmp_upload_dir='/var/tmp/php_upload_tmp' - mkdir -p $tmp_upload_dir - chown -R www-data:www-data $tmp_upload_dir + local upload_tmp_dir='/var/tmp/php_upload_tmp' + mkdir -p $upload_tmp_dir + chown -R www-data:www-data $upload_tmp_dir fi - G_CONFIG_INJECT 'upload_tmp_dir[[:blank:]]*=' "upload_tmp_dir=$tmp_upload_dir" $target_php_ini + G_CONFIG_INJECT 'upload_tmp_dir[[:blank:]]*=' "upload_tmp_dir=$upload_tmp_dir" $target_php_ini - # - max upload size + # - Max upload size local php_max_upload_size="$(( $(php -r 'print(PHP_INT_MAX);') / 1024 / 1024))M" # - upload_max_filesize G_CONFIG_INJECT 'upload_max_filesize[[:blank:]]*=' "upload_max_filesize=$php_max_upload_size" $target_php_ini # - post_max_size G_CONFIG_INJECT 'post_max_size[[:blank:]]*=' "post_max_size=$php_max_upload_size" $target_php_ini - # - Nginx - Set client_max_body_size to avoid 2MB upload error: https://github.com/MichaIng/DietPi/issues/546 - if (( ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then + # - Nginx: Set client_max_body_size to avoid 2MB upload error: https://github.com/MichaIng/DietPi/issues/546 + if (( ${aSOFTWARE_INSTALL_STATE[85]} > 0 )); then - sed -i "/client_max_body_size/c\ client_max_body_size $php_max_upload_size;" /etc/nginx/nginx.conf + sed -i "/client_max_body_size/c\ client_max_body_size $php_max_upload_size;" /etc/nginx/nginx.conf fi # - Set UTF-8 G_CONFIG_INJECT 'default_charset[[:blank:]]*=' 'default_charset="UTF-8"' $target_php_ini - # Enable all installed and available PHP modules. - local modules_to_enable=$(ls "$FP_PHP_BASE_DIR"/mods-available | grep '.ini' | sed 's/.ini//') - ${PHP_BINARY}enmod "$modules_to_enable" + # - PHP cache settings + local target_php_cachesize=$(( $RAM_TOTAL / 30 )) + (( $target_php_cachesize < 10 )) && target_php_cachesize=10 + # - OPcache + G_CONFIG_INJECT 'opcache.enable[[:blank:]]*=' 'opcache.enable=1' $target_php_ini + G_CONFIG_INJECT 'opcache.memory_consumption[[:blank:]]*=' "opcache.memory_consumption=$target_php_cachesize" $target_php_ini + G_CONFIG_INJECT 'opcache.revalidate_freq[[:blank:]]*=' 'opcache.revalidate_freq=60' $target_php_ini + # - APCu + G_CONFIG_INJECT 'apc.shm_size[[:blank:]]*=' "apc.shm_size=${target_php_cachesize}M" $target_php_ini + G_CONFIG_INJECT 'apc.ttl[[:blank:]]*=' 'apc.ttl=259200' $target_php_ini # 3 days TTL + + # Enable all available PHP modules + phpenmod $(ls $FP_PHP_BASE_DIR/mods-available | sed -n '/\.ini$/{s/\.ini$//;p}') # Create PHP info pages within webroot, if webserver is installed. - if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 || - ${aSOFTWARE_INSTALL_STATE[84]} >= 1 || - ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then + if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 || + ${aSOFTWARE_INSTALL_STATE[84]} > 0 || + ${aSOFTWARE_INSTALL_STATE[85]} > 0 )); then # PHP info page echo '' > /var/www/phpinfo.php @@ -7506,7 +7498,7 @@ _EOF_ ### Also for MariaDB? # Optimize for reduced memory use: https://github.com/MichaIng/DietPi/issues/605#issue-188930987 - #cat << _EOF_ > /etc/mysql/conf.d/reduce_resources.cnf + #cat << _EOF_ > /etc/mysql/mariadb.conf.d/99-dietpi.cnf #[mysqld] #key_buffer_size=8M #max_connections=30 @@ -7546,20 +7538,19 @@ _EOF_ Banner_Configuration # Enable redis php module, if installed: - ${PHP_BINARY}enmod redis 2> /dev/null + phpenmod redis 2> /dev/null fi - #OPENBAZAAR - software_id=58 + software_id=58 # OpenBazaar if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - # - Data dir + # Data dir mkdir -p $G_FP_DIETPI_USERDATA/openbazaar - # - Init OB to have config file available, if not yet the case, and edit to allow remote client access + # Init OB to have config file available, if not yet the case, and edit to allow remote client access if [[ ! -f $G_FP_DIETPI_USERDATA/openbazaar/config ]]; then openbazaar-go init -d $G_FP_DIETPI_USERDATA/openbazaar @@ -7599,13 +7590,12 @@ This is required, since the ${aSOFTWARE_WHIP_NAME[$software_id]} server node by fi - # - service + # Service cat << _EOF_ > /etc/systemd/system/openbazaar.service [Unit] Description=OpenBazaar (DietPi) [Service] -Type=simple Environment=GOPATH=$G_FP_DIETPI_USERDATA/go WorkingDirectory=$G_FP_DIETPI_USERDATA/go ExecStart=$(command -v openbazaar-go) start -d $G_FP_DIETPI_USERDATA/openbazaar @@ -7616,8 +7606,7 @@ _EOF_ fi - #YaCy - software_id=133 + software_id=133 # YaCy if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -7629,23 +7618,20 @@ _EOF_ Description=YaCy (DietPi) [Service] -Type=simple RemainAfterExit=yes -ExecStart=/bin/bash -c '/etc/yacy/startYACY.sh' -ExecStop=/bin/bash -c '/etc/yacy/stopYACY.sh' +ExecStart=/etc/yacy/startYACY.sh +ExecStop=/etc/yacy/stopYACY.sh [Install] WantedBy=multi-user.target _EOF_ - systemctl daemon-reload - # Create admin login account: + # Create admin login account: /etc/yacy/bin/passwd.sh "$GLOBAL_PW" fi - #Folding@Home - software_id=2 + software_id=2 # Folding@Home if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -7665,7 +7651,6 @@ _EOF_ Description=Folding@Home (DietPi) [Service] -Type=simple User=fahclient Group=dietpi WorkingDirectory=$G_FP_DIETPI_USERDATA/fahclient @@ -7673,24 +7658,23 @@ ExecStart=$(command -v FAHClient) --allow='0/0' --web-allow='0/0' --daemon=false [Install] WantedBy=multi-user.target - _EOF_ fi - #ownCloud - software_id=47 + software_id=47 # ownCloud if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration G_DIETPI-NOTIFY 2 'Enabling needed PHP modules.' # https://doc.owncloud.org/server/administration_manual/installation/manual_installation.html#php-extensions - ${PHP_BINARY}enmod curl gd intl json pdo_mysql opcache apcu redis + phpenmod curl gd intl json pdo_mysql opcache apcu redis # Following modules are switchable since Stretch: (( $G_DISTRO > 3 )) && phpenmod ctype dom fileinfo iconv mbstring posix simplexml xmlwriter xmlreader zip exif G_DIETPI-NOTIFY 2 'Enabling APCu memory cache for PHP command line usage (CLI) as well, including ownCloud occ command and cron jobs.' - G_CONFIG_INJECT 'apc.enable_cli[[:blank:]=]' 'apc.enable_cli=1' "$FP_PHP_BASE_DIR/mods-available/apcu.ini" + echo -e '; ownCloud PHP settngs\n; priority=99\napc.enable_cli=1' > $FP_PHP_BASE_DIR/mods-available/dietpi-owncloud.ini + phpenmod dietpi-owncloud if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then @@ -7899,7 +7883,7 @@ _EOF_ sed -i "s|'http://localhost'|'http://localhost/owncloud'|g" $config_php # Set pretty URLs (without /index.php/) on Apache: - if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then + if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then GCI_PRESERVE=1 G_CONFIG_INJECT "'htaccess.RewriteBase'" "'htaccess.RewriteBase' => '/owncloud'," $config_php "'overwrite.cli.url'" occ maintenance:update:htaccess @@ -7943,27 +7927,21 @@ _EOF_ fi - #Nextcloud - software_id=114 + software_id=114 #N extcloud if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - G_DIETPI-NOTIFY 2 'Enabling needed PHP modules.' # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation - ${PHP_BINARY}enmod curl gd intl json pdo_mysql opcache apcu redis + G_DIETPI-NOTIFY 2 'Enabling required PHP modules.' # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation + phpenmod curl gd intl json pdo_mysql opcache apcu redis # Following modules are switchable since Stretch: (( $G_DISTRO > 3 )) && phpenmod ctype dom fileinfo iconv mbstring posix simplexml xmlwriter xmlreader zip exif - G_DIETPI-NOTIFY 2 'Enabling APCu memory cache for PHP command line usage (CLI) as well, including Nextcloud ncc command and cron jobs.' - G_CONFIG_INJECT 'apc.enable_cli[[:blank:]=]' 'apc.enable_cli=1' "$FP_PHP_BASE_DIR/mods-available/apcu.ini" - - G_DIETPI-NOTIFY 2 'Enabling and configuring OPcache for Nextcloud.' # https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/server_tuning.html#enable-php-opcache - G_CONFIG_INJECT 'opcache.enable[[:blank:]=]' 'opcache.enable=1' "$FP_PHP_BASE_DIR/mods-available/opcache.ini" - G_CONFIG_INJECT 'opcache.enable_cli[[:blank:]=]' 'opcache.enable_cli=1' "$FP_PHP_BASE_DIR/mods-available/opcache.ini" - G_CONFIG_INJECT 'opcache.interned_strings_buffer[[:blank:]=]' 'opcache.interned_strings_buffer=8' "$FP_PHP_BASE_DIR/mods-available/opcache.ini" - G_CONFIG_INJECT 'opcache.max_accelerated_files[[:blank:]=]' 'opcache.max_accelerated_files=10000' "$FP_PHP_BASE_DIR/mods-available/opcache.ini" - G_CONFIG_INJECT 'opcache.save_comments[[:blank:]=]' 'opcache.save_comments=1' "$FP_PHP_BASE_DIR/mods-available/opcache.ini" - G_CONFIG_INJECT 'opcache.revalidate_freq[[:blank:]=]' 'opcache.revalidate_freq=1' "$FP_PHP_BASE_DIR/mods-available/opcache.ini" + G_DIETPI-NOTIFY 2 'Optimising APCu and OPcache modules for Nextcloud.' # https://docs.nextcloud.com/server/stable/admin_manual/configuration_server/server_tuning.html#enable-php-opcache + echo -e '; Nextcloud PHP settngs\n; priority=99\napc.enable_cli=1\nopcache.enable=1 +opcache.enable_cli=1\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=10000 +opcache.memory_consumption=128\nopcache.save_comments=1\nopcache.revalidate_freq=1' > $FP_PHP_BASE_DIR/mods-available/dietpi-nextcloud.ini + phpenmod dietpi-nextcloud if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then @@ -8200,7 +8178,7 @@ The install script will now exit. After applying one of the the above, rerun die sed -i "s|'http://localhost'|'http://localhost/nextcloud'|g" $config_php # Set pretty URLs (without /index.php/) on Apache: - if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then + if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then GCI_PRESERVE=1 G_CONFIG_INJECT "'htaccess.RewriteBase'" "'htaccess.RewriteBase' => '/nextcloud'," $config_php "'overwrite.cli.url'" ncc maintenance:update:htaccess @@ -8254,7 +8232,7 @@ The install script will now exit. After applying one of the the above, rerun die G_DIETPI-NOTIFY 2 'Configuring TURN server:' # Buster (systemd unit) - if (( $G_DISTRO > 4 )); then + if [[ -f '/lib/systemd/system/coturn.service' ]]; then # - Remove init.d service traces [[ -f /etc/init.d/coturn ]] && rm /etc/init.d/coturn @@ -8295,13 +8273,13 @@ The install script will now exit. After applying one of the the above, rerun die done invalid_text='' - local port=5349 + local port=3478 while : do G_WHIP_DEFAULT_ITEM=$port G_WHIP_INPUTBOX "${invalid_text}Please enter the network port, that should be used for your TURN server:\n -NB: This port needs to be forwarded by your router and/or opened in your firewall settings. Default value is: 5349" +NB: This port needs to be forwarded by your router and/or opened in your firewall settings. Default value is: 3478" if (( $? == 0 )) && disable_error=1 G_CHECK_VALIDINT "$G_WHIP_RETURNED_VALUE" 0; then port=$G_WHIP_RETURNED_VALUE @@ -8315,40 +8293,41 @@ NB: This port needs to be forwarded by your router and/or opened in your firewal done - # Adjust coturn settings + # Adjust coTURN settings # - On Buster by default /etc/turnserver.conf is not created. Use example or create empty file: - if [[ ! -f /etc/turnserver.conf ]]; then + if [[ ! -f '/etc/turnserver.conf' ]]; then > /etc/turnserver.conf - [[ -f /usr/share/doc/coturn/examples/etc/turnserver.conf.gz ]] && gzip -cd /usr/share/doc/coturn/examples/etc/turnserver.conf.gz > /etc/turnserver.conf + [[ -f '/usr/share/doc/coturn/examples/etc/turnserver.conf.gz' ]] && gzip -cd /usr/share/doc/coturn/examples/etc/turnserver.conf.gz > /etc/turnserver.conf fi + # - Estimate coTURN version to handle outdated settings correctly + local version=$(dpkg-query -Wf '${Version}' coturn); version=${version:0:7}; version=${version//./} + # https://help.nextcloud.com/t/howto-setup-nextcloud-talk-with-turn-server/30794 + G_CONFIG_INJECT 'listening-port=' "listening-port=$port" /etc/turnserver.conf G_CONFIG_INJECT 'fingerprint' 'fingerprint' /etc/turnserver.conf G_CONFIG_INJECT 'use-auth-secret' 'use-auth-secret' /etc/turnserver.conf + if (( $version < 4508 )); then + + G_CONFIG_INJECT 'lt-cred-mech' 'lt-cred-mech' /etc/turnserver.conf + + else + + sed -i '/^[[:blank:]]*lt-cred-mech/#lt-cred-mech/' /etc/turnserver.conf + + fi G_CONFIG_INJECT 'realm=' "realm=$domain" /etc/turnserver.conf GCI_PRESERVE=1 G_CONFIG_INJECT 'total-quota=' 'total-quota=100' /etc/turnserver.conf GCI_PRESERVE=1 G_CONFIG_INJECT 'bps-capacity=' 'bps-capacity=0' /etc/turnserver.conf G_CONFIG_INJECT 'stale-nonce' 'stale-nonce' /etc/turnserver.conf G_CONFIG_INJECT 'no-loopback-peers' 'no-loopback-peers' /etc/turnserver.conf - G_CONFIG_INJECT 'no-multicast-peers' 'no-multicast-peers' /etc/turnserver.conf - - # Add TLS settings, if LetsEncrypt certificates are available: - if [[ -f /DietPi/dietpi/.dietpi-letsencrypt && - -f /etc/letsencrypt/live/$(sed -n 1p /DietPi/dietpi/.dietpi-letsencrypt)/cert.pem ]]; then - - G_DIETPI-NOTIFY 2 'LetsEncrypt certificate found, will configure coturn TURN server to accept TLS connections' - # - Disable non-TLS listening port, enable TLS listening port: - G_CONFIG_INJECT 'listening-port=' "#listening-port=$port" /etc/turnserver.conf - G_CONFIG_INJECT 'tls-listening-port=' "tls-listening-port=$port" /etc/turnserver.conf - local fp_cert_dir="/etc/letsencrypt/live/$(sed -n 1p /DietPi/dietpi/.dietpi-letsencrypt)" - G_CONFIG_INJECT 'cert=' "cert=$fp_cert_dir/cert.pem" /etc/turnserver.conf - G_CONFIG_INJECT 'pkey=' "pkey=$fp_cert_dir/privkey.pem" /etc/turnserver.conf - # - Proven working default cipher, but thus should be properly reworked, e.g. to match webserver settings? - G_CONFIG_INJECT 'cipher-list=' 'cipher-list="ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5"' /etc/turnserver.conf + if (( $version < 4510 )); then + + G_CONFIG_INJECT 'no-multicast-peers' 'no-multicast-peers' /etc/turnserver.conf else - G_CONFIG_INJECT 'listening-port=' "listening-port=$port" /etc/turnserver.conf + sed -i '/^[[:blank:]]*no-multicast-peers/d' /etc/turnserver.conf fi @@ -8368,7 +8347,7 @@ NB: This port needs to be forwarded by your router and/or opened in your firewal secret=$(grep -m1 '^[[:blank:]]*static-auth-secret=' /etc/turnserver.conf) secret=${secret#*static-auth-secret=} ncc config:app:set spreed turn_servers --value="[{\"server\":\"$domain:$port\",\"secret\":\"$secret\",\"protocols\":\"udp,tcp\"}]" - unset secret domain port invalid_text + unset secret domain port invalid_text version fi @@ -8389,7 +8368,6 @@ NB: This port needs to be forwarded by your router and/or opened in your firewal G_CONFIG_INJECT '"cache-size-mb"' ' "cache-size-mb": '$(Optimize_BitTorrent 0)',' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"download-queue-size"' ' "download-queue-size": '$(Optimize_BitTorrent 1)',' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"peer-limit-global"' ' "peer-limit-global": '$(Optimize_BitTorrent 2)',' /etc/transmission-daemon/settings.json '^\{$' - G_CONFIG_INJECT '"max-peers-global"' ' "max-peers-global": '$(Optimize_BitTorrent 2)',' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"upload-slots-per-torrent"' ' "upload-slots-per-torrent": '$(Optimize_BitTorrent 3)',' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"port-forwarding-enabled"' ' "port-forwarding-enabled": true,' /etc/transmission-daemon/settings.json '^\{$' @@ -8402,7 +8380,9 @@ NB: This port needs to be forwarded by your router and/or opened in your firewal G_CONFIG_INJECT '"trash-original-torrent-files"' ' "trash-original-torrent-files": true,' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"download-dir"' ' "download-dir": "'$G_FP_DIETPI_USERDATA'/downloads",' /etc/transmission-daemon/settings.json '^\{$' - G_CONFIG_INJECT '"rpc-password"' ' "rpc-password": "'"$GLOBAL_PW"'",' /etc/transmission-daemon/settings.json '^\{$' + # - Double quotes need to be escaped in .json files: https://github.com/MichaIng/DietPi/issues/2484#issuecomment-481374924 + # - ToDo: Hash password directly. Which hash method is used? + GCI_PASSWORD=1 G_CONFIG_INJECT '"rpc-password"' ' "rpc-password": "'"${GLOBAL_PW//\"/\\\"}"'",' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"rpc-username"' ' "rpc-username": "root",' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"rpc-whitelist-enabled"' ' "rpc-whitelist-enabled": false,' /etc/transmission-daemon/settings.json '^\{$' G_CONFIG_INJECT '"message-level"' ' "message-level": 0,' /etc/transmission-daemon/settings.json '^\{$' @@ -8609,14 +8589,13 @@ _EOF_ getent passwd ympd &> /dev/null && usercmd='usermod' $usercmd ympd -G dietpi -s /usr/sbin/nologin - #YMPD service + # YMPD service cat << _EOF_ > /etc/systemd/system/ympd.service [Unit] Description=YMPD (DietPi) After=mpd.service [Service] -Type=simple #User=ympd # Changes to ympd during run Group=dietpi ExecStart=/usr/bin/ympd --user ympd --webport 1337 @@ -8643,7 +8622,6 @@ Description=myMPD (DietPi) After=mpd.service [Service] -Type=simple #User=mympd # Changes at runlevel Group=dietpi ExecStart=$(command -v mympd) /etc/mympd/mympd.conf @@ -8696,23 +8674,21 @@ _EOF_ fi - #NodeRed - software_id=122 + software_id=122 # Node-RED if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration mkdir -p $G_FP_DIETPI_USERDATA/node-red - adduser nodered --system --group --shell=/bin/nologin + adduser nodered --system --group --shell=/usr/bin/nologin usermod -a -G gpio nodered cat << _EOF_ > /etc/systemd/system/node-red.service [Unit] -Description=Node-Red (DietPi) +Description=Node-RED (DietPi) [Service] -Type=simple User=nodered ExecStart=/usr/local/bin/node-red -u $G_FP_DIETPI_USERDATA/node-red @@ -8788,7 +8764,6 @@ _EOF_ # - Non-hidden files/folders are data mv $G_FP_DIETPI_USERDATA/mopidy/* $G_FP_DIETPI_USERDATA/mopidy/data - else mkdir -p $G_FP_DIETPI_USERDATA/mopidy/data @@ -8862,7 +8837,6 @@ Description=MiniDLNA (DietPi) After=network.target [Service] -Type=simple User=minidlna Group=dietpi RuntimeDirectory=minidlna @@ -8870,23 +8844,20 @@ ExecStart=$(command -v minidlnad) -SR -f /etc/minidlna.conf [Install] WantedBy=multi-user.target - _EOF_ - #Copy Config + # Copy Config G_BACKUP_FP /etc/minidlna.conf dps_index=$software_id Download_Install 'minidlna.conf' /etc/minidlna.conf - #Setup data directories + # Setup data directories mkdir -p $G_FP_DIETPI_USERDATA/.MiniDLNA_Cache Download_Test_Media fi - - #NoIp - software_id=67 + software_id=67 # No-IP if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -8904,7 +8875,6 @@ ConditionPathExists=/usr/local/etc/no-ip2.conf [Service] Type=forking RemainAfterExit=yes - ExecStart=/usr/local/bin/noip2 ExecStop=/usr/bin/killall -w noip2 @@ -8914,13 +8884,12 @@ _EOF_ fi - #amiberry - software_id=108 + software_id=108 # Amiberry if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - #Allow binary execution + # Allow binary execution chmod -R +x $G_FP_DIETPI_USERDATA/amiberry local amiberry_filename=0 @@ -8964,7 +8933,7 @@ _EOF_ mkdir -p $G_FP_DIETPI_USERDATA/amiberry/hdf mkdir -p $G_FP_DIETPI_USERDATA/amiberry/cd - #Uae4arm does not support browsing symlinks (https://github.com/MichaIng/DietPi/issues/474#issuecomment-242973839) + # Uae4arm does not support browsing symlinks (https://github.com/MichaIng/DietPi/issues/474#issuecomment-242973839) # So we need to change config file default paths to actual userdata location: local fp_userdata_actual=$(readlink $G_FP_DIETPI_USERDATA) # Only returns a value if symlink exists (eg: off SDcard) if [[ -n $fp_userdata_actual ]]; then @@ -8987,7 +8956,6 @@ _EOF_ Description=AmiBerry Amiga Emulator (DietPi) [Service] -Type=simple #StandardOutput=tty #StandardInput=tty #TTYPath=/dev/tty1 @@ -9001,7 +8969,7 @@ WantedBy=local-fs.target _EOF_ cat << _EOF_ > $G_FP_DIETPI_USERDATA/amiberry/run.sh -#!/bin/bash +#!/bin/dash cd $G_FP_DIETPI_USERDATA/amiberry ./$amiberry_filename -f conf/autostart.uae _EOF_ @@ -9016,7 +8984,7 @@ _EOF_ Banner_Configuration - #Symlink savegames to root + # Symlink savegames to root # - Remove existing syslinks rm -R /root/.d1x-rebirth &> /dev/null rm -R /root/.d2x-rebirth &> /dev/null @@ -9024,10 +8992,10 @@ _EOF_ ln -sf $G_FP_DIETPI_USERDATA/dxx-rebirth/descent_1_profiles /root/.d1x-rebirth ln -sf $G_FP_DIETPI_USERDATA/dxx-rebirth/descent_2_profiles /root/.d2x-rebirth - #+exe + # +exe chmod +x -R $G_FP_DIETPI_USERDATA/dxx-rebirth/* - #Create .Desktop SymLinks + # Create .Desktop SymLinks mkdir -p /root/Desktop mkdir -p /usr/share/applications @@ -9036,17 +9004,16 @@ _EOF_ fi - #OpenTyrian - software_id=51 + software_id=51 # OpenTyrian if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - #Copy the DietPi run file for OpenTyrian - dps_index=$software_id Download_Install 'run' /usr/local/games/opentyrian/run - chmod +x /usr/local/games/opentyrian/run + # Copy the DietPi run file for OpenTyrian + dps_index=$software_id Download_Install 'run' /usr/games/opentyrian/run + chmod +x /usr/games/opentyrian/run - #Create .Desktop SymLinks + # Create .Desktop SymLinks mkdir -p /root/Desktop rm /usr/share/applications/opentyrian.desktop &> /dev/null G_RUN_CMD wget https://raw.githubusercontent.com/MichaIng/DietPi/$G_GITBRANCH/.conf/desktop/apps/opentyrian.desktop -O /usr/share/applications/opentyrian.desktop @@ -9077,10 +9044,9 @@ _EOF_ Description=Raspimjpeg (DietPi) [Service] -Type=simple RemainAfterExit=yes -ExecStart=$(command -v bash) -c '/var/lib/dietpi/dietpi-software/installed/raspimjpeg.sh start' -ExecStop=$(command -v bash) -c '/var/lib/dietpi/dietpi-software/installed/raspimjpeg.sh stop' +ExecStart=/var/lib/dietpi/dietpi-software/installed/raspimjpeg.sh start +ExecStop=/var/lib/dietpi/dietpi-software/installed/raspimjpeg.sh stop [Install] WantedBy=multi-user.target @@ -9200,8 +9166,8 @@ Description=Webmin (DietPi) [Service] Type=forking -ExecStart=$(command -v bash) -c '/etc/webmin/start' -ExecStop=$(command -v bash) -c '/etc/webmin/stop' +ExecStart=/etc/webmin/start +ExecStop=/etc/webmin/stop [Install] WantedBy=multi-user.target @@ -9251,8 +9217,7 @@ Do you want to enable the Pi-hole blocking page?'; then pihole -g # - Generate web interface PW: https://github.com/MichaIng/DietPi/issues/662 - pihole -a -p "$GLOBAL_PW" - G_WHIP_MSG "DietPi has changed the Pi-hole web interface password to:\n - $GLOBAL_PW\n\nPlease use this password when logging into the web interface:\n - http://$(sed -n 4p /DietPi/dietpi/.network)/admin\n\nThis password can be changed, please see pihole binary for info:\n - pihole --help" + pihole -a -p "$GLOBAL_PW" &> /dev/null #do not print. fi @@ -9265,7 +9230,7 @@ Do you want to enable the Pi-hole blocking page?'; then getent passwd airsonic &> /dev/null && usercmd='usermod' $usercmd airsonic -G dietpi,audio -d $G_FP_DIETPI_USERDATA/airsonic -s /usr/sbin/nologin - #Optimize memory limit + # Optimize memory limit local airsonic_memory_max=$(( $RAM_TOTAL / 5 )) (( $airsonic_memory_max < 200 )) && airsonic_memory_max=200 airsonic_memory_max+='m' @@ -9285,10 +9250,10 @@ ExecStart=$(command -v java) -Xmx$airsonic_memory_max -Dairsonic.home=$G_FP_DIET WantedBy=multi-user.target _EOF_ - #Symlink FFmpeg to Airsonic transcoder - ln -sf $(command -v ffmpeg) $G_FP_DIETPI_USERDATA/airsonic/transcode + # Symlink FFmpeg to Airsonic transcoder + command -v ffmpeg &> /dev/null && ln -sf $(command -v ffmpeg) $G_FP_DIETPI_USERDATA/airsonic/transcode - #Grab our test media for user + # Grab our test media for user Download_Test_Media fi @@ -9298,59 +9263,55 @@ _EOF_ Banner_Configuration - #Optimize memory limit - local subsonic_memory_max=$(( $RAM_TOTAL / 5 )) - if (( $subsonic_memory_max < 200 )); then - - subsonic_memory_max=200 + local usercmd='useradd -rM' + getent passwd subsonic &> /dev/null && usercmd='usermod' + $usercmd subsonic -G dietpi,audio -d /var/subsonic -s /usr/sbin/nologin - fi + # Optimize memory limit + local subsonic_memory_max=$(( $RAM_TOTAL / 5 )) + (( $subsonic_memory_max < 200 )) && subsonic_memory_max=200 - cat << _EOF_ > /etc/default/subsonic -SUBSONIC_USER=root -SUBSONIC_ARGS='--quiet --pidfile=/run/subsonic.pid --max-memory=$subsonic_memory_max --default-music-folder=$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC --default-podcast-folder=$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC --default-playlist-folder=$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC' -_EOF_ + G_CONFIG_INJECT 'SUBSONIC_USER=' 'SUBSONIC_USER=subsonic' /etc/default/subsonic + G_CONFIG_INJECT 'SUBSONIC_ARGS=' "SUBSONIC_ARGS='--quiet --pidfile=/run/subsonic.pid --max-memory=$subsonic_memory_max --default-music-folder=$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC --default-podcast-folder=$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC --default-playlist-folder=$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC'" /etc/default/subsonic - #Symlink FFmpeg to Subsonic transcoder - ln -fs $(command -v ffmpeg) /var/subsonic/transcode + # Symlink FFmpeg to Subsonic transcoder + mkdir -p /var/subsonic/transcode + command -v ffmpeg &> /dev/null && ln -sf $(command -v ffmpeg) /var/subsonic/transcode - #Grab our test media for user + # Grab our test media for user Download_Test_Media fi - #WEBIOPI - software_id=71 + software_id=71 # WEBIOPI if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - #auto start + # autostart update-rc.d webiopi defaults fi - #DIETPICLOUDSHELL - software_id=62 + software_id=62 # DietPi-CloudShell if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - #Enable DietPi-Cloudshell autostart + # Enable DietPi-Cloudshell autostart /DietPi/dietpi/dietpi-autostart 5 - #Service + # Service cat << _EOF_ > /etc/systemd/system/dietpi-cloudshell.service [Unit] Description=dietpi-cloudshell on main screen (DietPi) [Service] -Type=simple StandardOutput=tty TTYPath=/dev/tty1 ExecStartPre=$(command -v setterm) --term linux --blank 0 --powersave off --cursor off -ExecStart=/bin/bash -c '/DietPi/dietpi/dietpi-cloudshell 1' +ExecStart=/DietPi/dietpi/dietpi-cloudshell 1 ExecStop=$(command -v setterm) --reset ExecStop=$(command -v echo) 'DietPi-Cloudshell terminated, have a nice day!' @@ -9451,33 +9412,38 @@ _EOF_ fi - #SQUEEZEBOXSERVER - software_id=35 + software_id=35 # Logitech Media Server if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - #Remove bundled service + # Remove bundled SysVinit service systemctl stop logitechmediaserver &> /dev/null - killall -w squeezeboxserver &> /dev/null #provided service may not wait for exit, kill: https://github.com/MichaIng/DietPi/issues/1613#issuecomment-372787574 - + systemctl disable logitechmediaserver &> /dev/null + killall -qwr squeezeboxserver* # Provided service may not wait for exit, kill: https://github.com/MichaIng/DietPi/issues/1613#issuecomment-372787574 update-rc.d logitechmediaserver remove &> /dev/null - rm /etc/init.d/logitechmediaserver &> /dev/null + [[ -f '/etc/init.d/logitechmediaserver' ]] && rm /etc/init.d/logitechmediaserver + [[ -f '/etc/default/logitechmediaserver' ]] && rm /etc/default/logitechmediaserver + + # Grant user access to audio devices and DietPi media files + usermod -aG audio,dietpi squeezeboxserver - #Service - cat << _EOF_ > /etc/systemd/system/squeezeboxserver.service + # systemd service + cat << _EOF_ > /etc/systemd/system/logitechmediaserver.service [Unit] -Description=Squeezebox Server/LMS (DietPi) +Description=Logitech Media Server (DietPi) [Service] -Type=simple -ExecStart=$(command -v squeezeboxserver) --prefsdir /var/lib/squeezeboxserver/prefs --logfile /var/log/squeezeboxserver/error.log --logdir /var/log/squeezeboxserver/ --cachedir /var/lib/squeezeboxserver/cache --user root +User=squeezeboxserver +ExecStart=$(command -v squeezeboxserver) --prefsdir /var/lib/squeezeboxserver/prefs --logdir /var/log/squeezeboxserver/ --cachedir /var/lib/squeezeboxserver/cache --charset=utf8 --logfile /var/log/squeezeboxserver/error.log +Restart=on-failure +RestartSec=5 [Install] WantedBy=multi-user.target _EOF_ - #Grab our test media for user + # Grab our test media for user Download_Test_Media fi @@ -9500,7 +9466,7 @@ _EOF_ Banner_Configuration # Enable required PHP modules: https://github.com/FreshRSS/FreshRSS#requirements - ${PHP_BINARY}enmod curl gmp intl json pdo_mysql + phpenmod curl gmp intl json pdo_mysql (( $G_DISTRO > 3 )) && phpenmod ctype dom mbstring xml zip # Apache configuration @@ -9553,7 +9519,7 @@ _EOF_ #Banner_Configuration - echo -e "$GLOBAL_PW=\n$GLOBAL_PW=\nn" | vncpasswd + echo -e "$GLOBAL_PW=\n$GLOBAL_PW=\nn\n" | vncpasswd cat << _EOF_ > /etc/systemd/system/vncserver.service [Unit] @@ -9562,75 +9528,73 @@ Before=xrdp.service xrdp-sesman.service After=dietpi-boot.service dietpi-ramdisk.service dietpi-ramlog.service [Service] -Type=simple -User=root RemainAfterExit=yes PAMName=login Environment=HOME=/root -ExecStart=/bin/bash /usr/local/bin/vncserver start -ExecStop=/bin/bash /usr/local/bin/vncserver stop +ExecStart=/usr/local/bin/vncserver start +ExecStop=/usr/local/bin/vncserver stop [Install] WantedBy=multi-user.target _EOF_ - systemctl daemon-reload - systemctl enable vncserver.service + systemctl enable vncserver cat << _EOF_ > /usr/local/bin/vncserver #!/bin/bash -#Globals +# Globals VNC_INSTALLED=0 BINARY_FP=0 SHARED_MODE=0 -WIDTH=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_WIDTH=' /DietPi/dietpi.txt | sed 's/^.*=//') -HEIGHT=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_HEIGHT=' /DietPi/dietpi.txt | sed 's/^.*=//') -DEPTH=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_DEPTH=' /DietPi/dietpi.txt | sed 's/^.*=//') -DISPLAY=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_DISPLAY_INDEX=' /DietPi/dietpi.txt | sed 's/^.*=//') -SHARED_MODE=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_SHARE_DESKTOP=' /DietPi/dietpi.txt | sed 's/^.*=//') +WIDTH=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_WIDTH=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') +HEIGHT=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_HEIGHT=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') +DEPTH=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_DEPTH=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') +DISPLAY=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_DISPLAY_INDEX=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') +SHARED_MODE=\$(grep -m1 '^[[:blank:]]*SOFTWARE_VNCSERVER_SHARE_DESKTOP=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') -#RealVNC | Slightly different launch method to VNC4server +# RealVNC | Slightly different launch method to VNC4server REALVNC=0 -if (( \$(dpkg --get-selections | grep -ci -m1 '^realvnc-vnc-server') )); then +if dpkg-query -s realvnc-vnc-server &> /dev/null; then REALVNC=1 #Set shared desktop mode if autostart is enabled for desktops. This prevents another VNC server being launched on :1. - if (( \$( /dev/null - killall -w x11vnc &> /dev/null - killall -w Xtigervnc &> /dev/null - ;; + stop) + \$BINARY_FP -kill :\$DISPLAY &> /dev/null + killall -qw x11vnc + killall -qw Xtigervnc + ;; esac @@ -9667,15 +9631,15 @@ _EOF_ # + RealVNC | enable services if (( ${aSOFTWARE_INSTALL_STATE[120]} == 1 )); then - systemctl enable vncserver-x11-serviced.service - systemctl enable vncserver-virtuald.service + systemctl enable vncserver-x11-serviced + systemctl enable vncserver-virtuald fi # - Stretch + TigerVNC: Disable Localhost only by default - if (( $G_DISTRO >= 4 )); then + if (( $G_DISTRO > 3 )); then - echo -e '$localhost = "no";' >> /etc/vnc.conf + echo '$localhost = "no";' >> /etc/vnc.conf fi @@ -9683,31 +9647,36 @@ _EOF_ #VNC4SERVER / RealVNC software_id=28 - if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} >= 1 || - ${aSOFTWARE_INSTALL_STATE[120]} >= 1 )); then + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} > 0 || + ${aSOFTWARE_INSTALL_STATE[120]} > 0 )); then Banner_Configuration local cmd_launch_desktop='' - #DESKTOP_LXDE - if (( ${aSOFTWARE_INSTALL_STATE[23]} >= 1 )); then + # DESKTOP_LXDE + if (( ${aSOFTWARE_INSTALL_STATE[23]} > 0 )); then - cmd_launch_desktop='/usr/bin/lxsession -s LXDE &' + cmd_launch_desktop='lxsession -s LXDE &' - #DESKTOP_MATE - elif (( ${aSOFTWARE_INSTALL_STATE[24]} >= 1 )); then + # DESKTOP_MATE + elif (( ${aSOFTWARE_INSTALL_STATE[24]} > 0 )); then - cmd_launch_desktop='/usr/bin/mate-session &' + cmd_launch_desktop='mate-session &' - #DESKTOP_GNUSTEP - elif (( ${aSOFTWARE_INSTALL_STATE[26]} >= 1 )); then + # DESKTOP_GNUSTEP + elif (( ${aSOFTWARE_INSTALL_STATE[26]} > 0 )); then cmd_launch_desktop='x-window-manager &' - #DESKTOP_XFCE - elif (( ${aSOFTWARE_INSTALL_STATE[25]} >= 1 )); then + # DESKTOP_XFCE + elif (( ${aSOFTWARE_INSTALL_STATE[25]} > 0 )); then + + cmd_launch_desktop='xfce4-session &' + + # DESKTOP_LXQT + elif (( ${aSOFTWARE_INSTALL_STATE[173]} > 0 )); then - cmd_launch_desktop='/usr/bin/xfce4-session &' + cmd_launch_desktop='startlxqt &' fi @@ -9721,62 +9690,11 @@ xsetroot -solid grey vncconfig -iconic & $cmd_launch_desktop _EOF_ - chmod +x /root/.vnc/xstartup fi - #FAIL2BAN - software_id=73 - if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then - - Banner_Configuration - - G_BACKUP_FP /etc/fail2ban/fail2ban.conf /etc/fail2ban/jail.conf - cat << _EOF_ > /etc/fail2ban/fail2ban.conf -[Definition] -# loglevel #1=error #2=warn #3=info -loglevel = 3 -logtarget = /var/log/fail2ban.log -socket = /var/run/fail2ban/fail2ban.sock -pidfile = /var/run/fail2ban/fail2ban.pid -_EOF_ - - cat << _EOF_ > /etc/fail2ban/jail.conf -[DEFAULT] - -enabled = true -ignoreip = 127.0.0.1/8 -ignorecommand = -backend = systemd -bantime = 600 -findtime = 600 -maxretry = 3 -banaction = route -action_ = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s"] -action = %(action_)s - -[sshd] - -enabled = true -port = ssh -filter = sshd -logpath = /var/log/auth.log -maxretry = 3 - -[dropbear] - -enabled = true -port = ssh -filter = dropbear -logpath = /var/log/auth.log -maxretry = 3 -_EOF_ - - fi - - #InfluxDB - software_id=74 + software_id=74 # InfluxDB if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -9787,8 +9705,7 @@ _EOF_ fi - #Grafana - software_id=77 + software_id=77 # Grafana if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -9807,7 +9724,7 @@ _EOF_ ln -sf $G_FP_DIETPI_USERDATA/grafana /var/lib/grafana # - Set password, wrap into trippled double quotes in case of ; or # being contained, according to docs: http://docs.grafana.org/installation/configuration/#password - GCI_PRESERVE=1 G_CONFIG_INJECT 'admin_password[[:blank:]]*=' "admin_password = \"\"\"$GLOBAL_PW\"\"\"" /etc/grafana/grafana.ini + GCI_PASSWORD=1 GCI_PRESERVE=1 G_CONFIG_INJECT 'admin_password[[:blank:]]*=' "admin_password = \"\"\"$GLOBAL_PW\"\"\"" /etc/grafana/grafana.ini G_CONFIG_INJECT 'http_port = ' 'http_port = 3001' /etc/grafana/grafana.ini fi @@ -9829,7 +9746,6 @@ Description=Ubooquity (DietPi) After=dietpi-boot.service network.target [Service] -Type=simple User=ubooquity WorkingDirectory=$G_FP_DIETPI_USERDATA/ubooquity ExecStart=$(command -v java) -jar $G_FP_DIETPI_USERDATA/ubooquity/Ubooquity.jar --headless --remoteadmin --adminport 2038 --libraryport 2039 @@ -9857,19 +9773,19 @@ _EOF_ Banner_Configuration - #Get test images + # Get test images mkdir -p /var/www/gallery/DietPi wget https://dietpi.com/images/dietpi-logo_256.png -O /var/www/gallery/DietPi/logo_256.png mkdir -p /var/www/gallery/Tr-Zero - wget http://media.indiedb.com/images/games/1/25/24673/SS_0.jpg -O /var/www/gallery/Tr-Zero/SS_0.jpg - wget http://media.indiedb.com/images/games/1/25/24673/SS_44.jpg -O /var/www/gallery/Tr-Zero/SS_1.jpg - wget http://media.indiedb.com/images/games/1/25/24673/3.png -O /var/www/gallery/Tr-Zero/SS_2.jpg + wget https://media.indiedb.com/images/games/1/25/24673/SS_0.jpg -O /var/www/gallery/Tr-Zero/SS_0.jpg + wget https://media.indiedb.com/images/games/1/25/24673/SS_44.jpg -O /var/www/gallery/Tr-Zero/SS_1.jpg + wget https://media.indiedb.com/images/games/1/25/24673/3.png -O /var/www/gallery/Tr-Zero/SS_2.jpg - #permissions for cache/thumbnail/database + # Permissions for cache/thumbnail/database mkdir -p /var/www/gallery/_sfpg_data - #enable (Some type of security trigger) + # Enable (Some type of security trigger) sed -i "/define('SECURITY_PHRASE'/c\define('SECURITY_PHRASE', 'true');" /var/www/gallery/index.php fi @@ -9882,14 +9798,14 @@ _EOF_ Download_Test_Media - #create/insert our pre-made ampache sql db + # Create/insert our pre-made ampache sql db Download_Install 'https://dietpi.com/downloads/mysql_databases/ampache_mysql_3.8.2-v6.0.zip' /DietPi/dietpi/func/create_mysql_db ampache ampache "$GLOBAL_PW" mysql ampache < ampache.sql rm ampache.sql - #Grab config + # Grab config G_RUN_CMD wget https://dietpi.com/downloads/conf/ampache.cfg.php_3.8.2-v6.0 -O /var/www/ampache/config/ampache.cfg.php fi @@ -10023,8 +9939,7 @@ _EOF_ fi - #WireGuard - software_id=172 + software_id=172 # WireGuard if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then # Try to enable module, if it fails, a reboot is required @@ -10039,7 +9954,7 @@ _EOF_ G_WHIP_MENU_ARRAY=( 'Server' ': Use this machine as VPN server and allow clients to connect to it.' - 'Client' ': Use this machine as VPN client, e.g. to connect to a VPN service provider.' + 'Client' ': Use this machine as VPN client to connect to another VPN server or service provider.' ) @@ -10111,8 +10026,13 @@ Address = 10.9.0.1/24 PrivateKey = $( /etc/sysctl.d/dietpi-wireguard.conf - # - Start WireGuard interface via systemd unit (( $module_active )) && systemctl start wg-quick@wg0 # persistent @@ -10203,8 +10118,7 @@ If no WireGuard (auto)start is included, but you require it, please do the follo fi - #WIFIHOTSPOT - software_id=60 + software_id=60 # WiFi Hostspot if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -10231,14 +10145,12 @@ subnet 192.168.42.0 netmask 255.255.255.0 { _EOF_ # - Assign wlan as interface for dhcp server. - cat << _EOF_ > /etc/default/isc-dhcp-server -INTERFACES="wlan$wifi_index" -_EOF_ + echo "INTERFACESv4=\"wlan$wifi_index\"" > /etc/default/isc-dhcp-server # - Remove all entries below wlan, so we can recreate them. sed -i '/allow-hotplug wlan/q0' /etc/network/interfaces - # - enable up wlan + # - Enable up wlan sed -i "/allow-hotplug wlan/c\allow-hotplug wlan$wifi_index" /etc/network/interfaces # - Add wifi settings to network interfaces config @@ -10255,38 +10167,31 @@ up iptables-restore < /etc/iptables.ipv4.nat _EOF_ # - Assign static IP for wlan now - #ifconfig wlan$wifi_index 192.168.42.1 - ip addr add 192.168.42.1 dev wlan$wifi_index + ip a add 192.168.42.1 dev wlan$wifi_index # - Create access point config G_BACKUP_FP /etc/hostapd/hostapd.conf cat << _EOF_ > /etc/hostapd/hostapd.conf interface=wlan$wifi_index driver=nl80211 -ssid=$(grep -m1 '^[[:blank:]]*SOFTWARE_WIFI_HOTSPOT_SSID=' /DietPi/dietpi.txt | sed 's/^.*=//') +ssid=$(grep -m1 '^[[:blank:]]*SOFTWARE_WIFI_HOTSPOT_SSID=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') hw_mode=g -channel=$(grep -m1 '^[[:blank:]]*SOFTWARE_WIFI_HOTSPOT_CHANNEL=' /DietPi/dietpi.txt | sed 's/^.*=//') +channel=$(grep -m1 '^[[:blank:]]*SOFTWARE_WIFI_HOTSPOT_CHANNEL=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 -wpa_passphrase=$(grep -m1 '^[[:blank:]]*SOFTWARE_WIFI_HOTSPOT_KEY=' /DietPi/dietpi.txt | sed 's/^.*=//') +wpa_passphrase=$(grep -m1 '^[[:blank:]]*SOFTWARE_WIFI_HOTSPOT_KEY=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP _EOF_ # - Check for RTL8188C* device, use the patched driver with compiled binary: https://github.com/pritambaral/hostapd-rtl871xdrv#why - if (( $WIFIHOTSPOT_RTL8188C_DEVICE )); then - - sed -i "/^driver=/c\driver=rtl871xdrv" /etc/hostapd/hostapd.conf - - fi + (( $WIFIHOTSPOT_RTL8188C_DEVICE )) && G_CONFIG_INJECT 'driver=' 'driver=rtl871xdrv' /etc/hostapd/hostapd.conf # - Enable access point config - cat << _EOF_ > /etc/default/hostapd -DAEMON_CONF="/etc/hostapd/hostapd.conf" -_EOF_ + echo "DAEMON_CONF=\"/etc/hostapd/hostapd.conf\"" > /etc/default/hostapd # - Enable IP forwarding echo -e 'net.ipv4.ip_forward=1\nnet.ipv6.conf.all.forwarding=1\nnet.ipv6.conf.default.forwarding=1' > /etc/sysctl.d/dietpi-wifihotspot.conf @@ -10300,18 +10205,12 @@ _EOF_ # - Save IP tables, applied during ifup in /etc/network/interfaces. iptables-save > /etc/iptables.ipv4.nat - # - RPi 3 - onboard wifi, enable N - if (( $G_HW_MODEL == 3 && ! $WIFIHOTSPOT_RTL8188C_DEVICE )); then - - # - Add Wireless N support - G_CONFIG_INJECT 'ieee80211n=' 'ieee80211n=1' /etc/hostapd/hostapd.conf - - fi + # - RPi 3 Onboard WiFi: Enable N support + (( $G_HW_MODEL == 3 && ! $WIFIHOTSPOT_RTL8188C_DEVICE )) && G_CONFIG_INJECT 'ieee80211n=' 'ieee80211n=1' /etc/hostapd/hostapd.conf fi - #TORHOTSPOT - software_id=61 + software_id=61 # Tor Hotspot if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -10377,7 +10276,6 @@ metadata = socket_msglength = 65000; }; - alsa = { // mixer_control_name = "PCM"; @@ -10400,7 +10298,7 @@ _EOF_ Banner_Configuration # PHP configuration - ${PHP_BINARY}enmod apcu gd intl pdo_mysql + phpenmod apcu gd intl pdo_mysql (( $G_DISTRO > 3 )) && phpenmod dom mbstring xml # Webserver config @@ -10467,7 +10365,6 @@ _EOF_ fi - #SQUEEZELITE software_id=36 if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then @@ -10754,18 +10651,17 @@ _EOF_ fi - #MINEOS - software_id=53 + software_id=53 # MineOS if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - # - Add underprivilged user for web access | no longer works, could be a nodejs v8 issue? + # Add underprivilged user for web access | no longer works, could be a nodejs v8 issue? useradd mineos echo -e "$GLOBAL_PW\n$GLOBAL_PW\n" | passwd mineos - #Stop mineos from running while we config it. When we didnt do this, the program would constantly overwrite our symlink from (/var/games/minecraft). - /DietPi/dietpi/dietpi-services stop + # Stop mineos from running while we config it. When we didnt do this, the program would constantly overwrite our symlink from (/var/games/minecraft). + #/DietPi/dietpi/dietpi-services stop # Already done after install step now killall -w supervisord &> /dev/null killall -w node &> /dev/null killall -w nodejs &> /dev/null @@ -10827,12 +10723,11 @@ DefaultDependencies=no After=mysqld.service mysql.service mariadb.service [Service] -Type=simple User=gogs Group=gogs WorkingDirectory=/etc/gogs Environment=USER=gogs HOME=/etc/gogs -ExecStart=/etc/gogs/gogs web &> /var/log/gogs/gogs_daemon.log +ExecStart=/bin/dash -c '/etc/gogs/gogs web 2>&1 > /var/log/gogs/gogs_daemon.log' StandardOutput=tty [Install] @@ -10940,7 +10835,6 @@ Description=qBittorrent (DietPi) After=network.target [Service] -Type=simple User=qbittorrent Group=dietpi RemainAfterExit=yes @@ -11086,7 +10980,6 @@ _EOF_ G_CONFIG_INJECT 'ExecStart=' "ExecStart=$(command -v rtorrent)" /etc/systemd/system/rtorrent.service fi - systemctl daemon-reload # - Default conf, do not overwrite if existent # Example: https://github.com/rakshasa/rtorrent/blob/master/doc/rtorrent.rc @@ -11285,7 +11178,6 @@ _EOF_ Description=Aria2 (DietPi) [Service] -Type=simple ExecStart=$(command -v aria2c) --conf-path=/var/lib/dietpi/dietpi-software/installed/aria2.conf [Install] @@ -11328,16 +11220,15 @@ _EOF_ # - Enable filesystem watcher (previously inotify) sed -i 's/fsWatcherEnabled=\"false\"/fsWatcherEnabled=\"true\"/g' $G_FP_DIETPI_USERDATA/syncthing/config.xml - #services + # Services cat << _EOF_ > /etc/systemd/system/syncthing.service [Unit] Description=Syncthing (DietPi) After=network.target [Service] -Type=simple -ExecStart=/etc/syncthing/syncthing -logfile=/var/log/syncthing/syncthing.log -logflags=3 -home=$G_FP_DIETPI_USERDATA/syncthing User=dietpi +ExecStart=/etc/syncthing/syncthing -logfile=/var/log/syncthing/syncthing.log -logflags=3 -home=$G_FP_DIETPI_USERDATA/syncthing [Install] WantedBy=multi-user.target @@ -11392,7 +11283,6 @@ _EOF_ Description=Tonido (DietPi) [Service] -Type=simple User=tonido Group=dietpi WorkingDirectory=$G_FP_DIETPI_USERDATA/tonido @@ -11423,8 +11313,7 @@ _EOF_ fi - #Chromium - software_id=113 + software_id=113 # Chromium if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -11594,11 +11483,10 @@ _EOF_ cat << _EOF_ > /etc/systemd/system/darkice.service [Unit] Description=DarkIce (DietPi) -After=icecast2.service Requires=icecast2.service +After=icecast2.service [Service] -Type=simple ExecStart=$(command -v darkice) [Install] @@ -11620,7 +11508,6 @@ Description=Mosquitto (DietPi) After=network.target [Service] -Type=simple ExecStart=$(command -v mosquitto) -c /etc/mosquitto/mosquitto.conf [Install] @@ -11629,13 +11516,12 @@ _EOF_ fi - #Blynk - software_id=131 + software_id=131 # Blynk if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration - # - Preserve existing config + # Preserve existing config if [[ ! -f $G_FP_DIETPI_USERDATA/blynk/server.properties ]]; then local config_file_url_address='https://raw.githubusercontent.com/blynkkk/blynk-server/master/server/core/src/main/resources/server.properties' @@ -11644,17 +11530,16 @@ _EOF_ fi - # - User + # User useradd -rM blynk -G dietpi -s /usr/sbin/nologin - # - Service + # Service cat << _EOF_ > /etc/systemd/system/blynkserver.service [Unit] Description=Blynk Server (DietPi) After=network.target [Service] -Type=simple User=blynk Group=dietpi ExecStart=$(command -v java) -jar $G_FP_DIETPI_USERDATA/blynk/blynkserver.jar -serverConfig $G_FP_DIETPI_USERDATA/blynk/server.properties @@ -11671,7 +11556,7 @@ _EOF_ Banner_Configuration - #Enable RPi cam + # Enable RPi cam if (( $G_HW_MODEL < 10 )); then /DietPi/dietpi/func/dietpi-set_hardware rpi-camera enable @@ -11685,7 +11570,7 @@ _EOF_ mkdir -p $G_FP_DIETPI_USERDATA/motioneye sed -i "/^media_path/c\media_path $G_FP_DIETPI_USERDATA/motioneye" /etc/motioneye/motioneye.conf - # service + # Service cp /usr/local/share/motioneye/extra/motioneye.systemd-unit-local /etc/systemd/system/motioneye.service fi @@ -11696,7 +11581,7 @@ _EOF_ Banner_Configuration - # - Enable web admin + # Enable web admin G_RUN_CMD systemctl start cups cupsctl --remote-admin usermod -a -G lpadmin root @@ -11704,8 +11589,7 @@ _EOF_ fi - #VirtualHere - software_id=138 + software_id=138 # VirtualHere if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -11716,21 +11600,17 @@ Description=VirtualHere (DietPi) After=local-fs.target [Service] -Type=simple - ExecStart=/etc/vhusbd/vhusbd -r /var/log/virtualhere.log [Install] WantedBy=multi-user.target _EOF_ - systemctl daemon-reload - echo -e "ServerName='DietPi'" > /etc/vhusbd/config.ini + echo "ServerName='DietPi'" > /etc/vhusbd/config.ini fi - #SABnzbd - software_id=139 + software_id=139 # SABnzbd if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -11743,7 +11623,6 @@ Description=sabnzbd (DietPi) [Service] User=sabnzbd Group=dietpi -Type=simple ExecStart=$(command -v python) /etc/sabnzbd/SABnzbd.py -f /etc/sabnzbd/sabnzbd.ini [Install] @@ -11755,7 +11634,7 @@ _EOF_ chown -R sabnzbd:dietpi /etc/sabnzbd chown -R sabnzbd:dietpi /var/log/sabnzbd - #Create config: + # Create config: # API keys and intial config are only generated during 1st run of sabnzbd # We need to launch program, then apply our config tweaks, else, wizard setup in web interface simply loops without API keys. rm /etc/sabnzbd/sabnzbd.ini &> /dev/null @@ -11805,7 +11684,6 @@ Description=spotify-connect-web (DietPi) After=sound.target [Service] -Type=simple WorkingDirectory=$G_FP_DIETPI_USERDATA/spotify-connect-web ExecStart=$G_FP_DIETPI_USERDATA/spotify-connect-web/spotify-connect-web @@ -11851,11 +11729,11 @@ _EOF_ G_CONFIG_INJECT 'DB_HOST=' 'DB_HOST=127.0.0.1' .env G_CONFIG_INJECT 'DB_DATABASE=' 'DB_DATABASE=koel' .env G_CONFIG_INJECT 'DB_USERNAME=' 'DB_USERNAME=koel' .env - G_CONFIG_INJECT 'DB_PASSWORD=' "DB_PASSWORD=$GLOBAL_PW" .env + GCI_PASSWORD=1 G_CONFIG_INJECT 'DB_PASSWORD=' "DB_PASSWORD=$GLOBAL_PW" .env # ADMIN env vars are not used any more, user prompt will ask for info. #G_CONFIG_INJECT 'ADMIN_EMAIL=' 'ADMIN_EMAIL=dietpi@dietpi.com' .env #G_CONFIG_INJECT 'ADMIN_NAME=' 'ADMIN_NAME=admin' .env - #G_CONFIG_INJECT 'ADMIN_PASSWORD=' "ADMIN_PASSWORD=$GLOBAL_PW" .env + #GCI_PASSWORD=1 G_CONFIG_INJECT 'ADMIN_PASSWORD=' "ADMIN_PASSWORD=$GLOBAL_PW" .env G_CONFIG_INJECT 'FFMPEG_PATH=' "FFMPEG_PATH=$(command -v ffmpeg)" .env php artisan koel:init @@ -11868,7 +11746,6 @@ _EOF_ Description=Koel (DietPi) [Service] -Type=simple User=koel Group=dietpi WorkingDirectory=$G_FP_DIETPI_USERDATA/koel @@ -11898,7 +11775,6 @@ After=network.target [Service] User=sonarr Group=dietpi -Type=simple ExecStart=/usr/bin/mono -O=-aot /opt/NzbDrone/NzbDrone.exe -nobrowser -data=$G_FP_DIETPI_USERDATA/sonarr [Install] @@ -11933,7 +11809,6 @@ After=network.target [Service] User=radarr Group=dietpi -Type=simple ExecStart=/usr/bin/mono -O=-aot /opt/Radarr/Radarr.exe -nobrowser -data=$G_FP_DIETPI_USERDATA/radarr [Install] @@ -11968,7 +11843,6 @@ After=network.target [Service] User=lidarr Group=dietpi -Type=simple ExecStart=/usr/bin/mono -O=-aot /opt/Lidarr/Lidarr.exe -nobrowser -data=$G_FP_DIETPI_USERDATA/lidarr [Install] @@ -12032,7 +11906,6 @@ WorkingDirectory=/opt/jackett Environment=USER=jackett HOME=/opt/jackett Restart=always RestartSec=5 -Type=simple ExecStart=/usr/bin/mono -O=-aot /opt/jackett/JackettConsole.exe TimeoutStopSec=20 @@ -12093,8 +11966,7 @@ _EOF_ fi - #HTPC Manager - software_id=155 + software_id=155 # HTPC Manager if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then Banner_Configuration @@ -12105,7 +11977,6 @@ Description=HTPC Manager (DietPi) After=network.target [Service] -Type=simple ExecStart=/usr/bin/python $G_FP_DIETPI_USERDATA/htpc-manager/Htpc.py [Install] @@ -12125,7 +11996,6 @@ _EOF_ Description=OctoPrint (DietPi) [Service] -Type=simple ExecStart=$(command -v octoprint) serve --iknowwhatimdoing [Install] @@ -12146,7 +12016,6 @@ Description=Roon Server (DietPi) After=network.target [Service] -Type=simple Environment=ROON_DATAROOT=$G_FP_DIETPI_USERDATA/roonserver ExecStart=$G_FP_DIETPI_USERDATA/roonserver/start.sh @@ -12182,7 +12051,6 @@ Description=Home Assistant (DietPi) After=network.target [Service] -Type=simple User=homeassistant ExecStart=/srv/homeassistant/homeassistant-start.sh @@ -12229,7 +12097,7 @@ _EOF_ Banner_Configuration - #Set docker service to 'simple': https://github.com/MichaIng/DietPi/issues/2238#issuecomment-439474766 + # Set docker service to 'simple': https://github.com/MichaIng/DietPi/issues/2238#issuecomment-439474766 mkdir -p /lib/systemd/system/docker.service.d echo -e '[Service]\nType=simple' > /lib/systemd/system/docker.service.d/dietpi-simple.conf @@ -12330,7 +12198,6 @@ _EOF_ fi - #Allo Config software_id=159 # 160 for quick reinstall/update if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 || @@ -12340,19 +12207,19 @@ _EOF_ #Create allo user for GUI useradd -m allo -s /bin/bash -G www-data - chpasswd <<< "allo:allo" - echo -e "allo ALL=NOPASSWD: ALL" > /etc/sudoers.d/allo + chpasswd <<< 'allo:allo' + echo 'allo ALL=NOPASSWD: ALL' > /etc/sudoers.d/allo #Always Drop DB, and, recreate it, due to error issue with reinstall over the top. mysqladmin drop allo_db -f &> /dev/null - mysql -e "drop user allo_db@localhost" &> /dev/null + mysql -e 'drop user allo_db@localhost' &> /dev/null /DietPi/dietpi/func/create_mysql_db allo_db allo_db "$GLOBAL_PW" mysql allo_db < /var/www/allo_db.sql - rm /var/www/allo_db.sql + [[ -f /var/www/allo_db.sql ]] && rm /var/www/allo_db.sql # - Redirect to web interface by default: - rm /var/www/index.htm* + rm -f /var/www/index.htm* cat << _EOF_ > /var/www/index.php _EOF_ - #HW specific changes + # HW specific changes # - SPARKY ONLY - Auto detect eth adapter if (( $G_HW_MODEL == 70 )); then @@ -12375,15 +12242,14 @@ Description=Sparky auto detect and set onboard ETH/USB ETH (DietPi) After=network.target networking.service [Service] -Type=simple RemainAfterExit=yes -ExecStart=/bin/bash -c '/usr/local/bin/sparky_eth_controller.sh' +ExecStart=/usr/local/bin/sparky_eth_controller.sh [Install] WantedBy=multi-user.target _EOF_ systemctl daemon-reload - systemctl enable sparky_eth_controller.service + systemctl enable sparky_eth_controller cat << _EOF_ > /usr/local/bin/sparky_eth_controller.sh #!/bin/bash @@ -12392,22 +12258,19 @@ sleep 20 # - Set USB ETH if found if ip a | grep -qi 'eth1'; then - echo -e "blacklist ethernet" > /etc/modprobe.d/disable_sparkysbc_ethernet.conf - rm /etc/udev/rules.d/70-persistent-net.rules &> /dev/null - rm /etc/udev/rules.d/70-persistant-net.rules &> /dev/null + echo 'blacklist ethernet' > /etc/modprobe.d/disable_sparkysbc_ethernet.conf + rm -f /etc/udev/rules.d/70-persist{a,e}nt-net.rules reboot # - Enable onboard ETH if no adapter found elif ! ip a | grep -qi 'eth0'; then - rm /etc/modprobe.d/disable_sparkysbc_ethernet.conf &> /dev/null - rm /etc/udev/rules.d/70-persistent-net.rules &> /dev/null - rm /etc/udev/rules.d/70-persistant-net.rules &> /dev/null + [[ -f '/etc/modprobe.d/disable_sparkysbc_ethernet.conf' ]] && rm /etc/modprobe.d/disable_sparkysbc_ethernet.conf + rm -f /etc/udev/rules.d/70-persist{a,e}nt-net.rules reboot fi _EOF_ - chmod +x /usr/local/bin/sparky_eth_controller.sh fi @@ -12464,11 +12327,11 @@ PATH+=':$HOME/wiringPi/gpio' TICKRATE=0.25 -echo -e "Audiophonics Shutdown script starting..." -echo -e "Asserting pins : " -echo -e "ShutDown : GPIO17=in, Low" -echo -e "BootOK : GPIO22=out, High" -echo -e "SoftSD : GPIO04=out, Low" +echo 'Audiophonics Shutdown script starting... +Asserting pins : +ShutDown : GPIO17=in, Low +BootOK : GPIO22=out, High +SoftSD : GPIO04=out, Low' gpio -g mode 04 out gpio -g write 04 0 @@ -12482,7 +12345,7 @@ do if (( \$(gpio -g read 17) == 1 )); then - G_DIETPI-NOTIFY 0 "AudioPhonics Pi-SPC: Power off requested. Shutting down system." + G_DIETPI-NOTIFY 0 'AudioPhonics Pi-SPC: Power off requested. Shutting down system.' sudo poweroff #sudo shutdown -h -P now break @@ -12495,7 +12358,6 @@ done exit 0 _EOF_ - chmod +x /var/lib/dietpi/dietpi-software/installed/pi-spc/sds.sh cat << _EOF_ > /etc/systemd/system/pi-spc.service @@ -12503,17 +12365,15 @@ _EOF_ Description=AudioPhonics Pi-SPC (DietPi) [Service] -Type=simple StandardOutput=tty - -ExecStart=/bin/bash -c '/var/lib/dietpi/dietpi-software/installed/pi-spc/sds.sh' +ExecStart=/var/lib/dietpi/dietpi-software/installed/pi-spc/sds.sh [Install] WantedBy=multi-user.target _EOF_ - # G_CONFIG_INJECT 'dtoverlay=gpio-shutdown' 'dtoverlay=gpio-shutdown,gpio_pin=22,active_low=0' /DietPi/config.txt - # G_CONFIG_INJECT 'dtoverlay=gpio-poweroff' 'dtoverlay=gpio-poweroff,gpio_pin=17' /DietPi/config.txt + #G_CONFIG_INJECT 'dtoverlay=gpio-shutdown' 'dtoverlay=gpio-shutdown,gpio_pin=22,active_low=0' /DietPi/config.txt + #G_CONFIG_INJECT 'dtoverlay=gpio-poweroff' 'dtoverlay=gpio-poweroff,gpio_pin=17' /DietPi/config.txt fi @@ -12529,7 +12389,7 @@ _EOF_ # - Generate cache dir mkdir -p /home/dietpi/.cache/voice-recognizer - #Setup soundcard + # Setup soundcard /DietPi/dietpi/func/dietpi-set_hardware soundcard googlevoicehat-soundcard fi @@ -12616,14 +12476,6 @@ _EOF_ fi - #Roon Extension Manager - software_id=86 - if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == 1 )); then - - Banner_Configuration - - fi - #------------------------------------------------------------------ } @@ -12633,7 +12485,7 @@ _EOF_ local gpu_enabled=0 local gpu_memory=0 - #Define Memory Split Modes with installed software + # Define Memory Split Modes with installed software local hw_memory_size=$(cat /DietPi/dietpi/.hw_model | grep -m1 'HW_MEMORY_SIZE=' | sed 's/^[^=]*=//') # - Kodi @@ -12674,7 +12526,7 @@ _EOF_ fi - #Apply + # Apply if (( $gpu_memory > 0 && $G_HW_MODEL < 10 )); then # - Never override a higher existing value @@ -12689,7 +12541,7 @@ _EOF_ fi - #Disable headless/enable GPU's + # Disable headless/enable GPU's (( $gpu_enabled )) && /DietPi/dietpi/func/dietpi-set_hardware headless 0 } @@ -12700,7 +12552,7 @@ _EOF_ FP_DIETPI_DEDICATED_USBDRIVE=$(df -P | mawk '/^\/dev\/sda1/ {print $6;exit}') - #Only enable if mounted + # Only enable if mounted if [[ $FP_DIETPI_DEDICATED_USBDRIVE ]] && df -P | grep -qi "$FP_DIETPI_DEDICATED_USBDRIVE"; then @@ -12712,7 +12564,7 @@ _EOF_ Uninstall_Software(){ - #NB: systemctl daemon-reload is executed at the end of this function + # NB: systemctl daemon-reload is executed at the end of this function local software_id=-1 @@ -12722,7 +12574,35 @@ _EOF_ apt-mark unhold pcmanfm #RPi Banner_Uninstalling - G_AGP lxde $(dpkg --get-selections lxde-* | mawk '{print $1}') upower policykit-1 firefox-esr + apt-mark auto upower policykit-1 firefox-esr + G_AGP lxde $(dpkg --get-selections lxde-* | mawk '{print $1}') + rm -Rf /root/.config/{lxpanel,lxsession,lxterminal} + + fi + + software_id=173 + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then + + Banner_Uninstalling + apt-mark auto qterminal firefox-esr xarchiver lxde-icon-theme upower xscreensaver leafpad speedcrunch + G_AGP lxqt + [[ -d '/root/.config/lxqt' ]] && rm -R /root/.config/lxqt + + fi + + software_id=174 + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then + + Banner_Uninstalling + G_AGP gimp + + fi + + software_id=175 + if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then + + Banner_Uninstalling + G_AGP xfce4-power-manager fi @@ -12730,7 +12610,8 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - G_AGP mate-desktop-environment-extras upower policykit-1 firefox-esr + apt-mark auto upower policykit-1 firefox-esr + G_AGP mate-desktop-environment-extras fi @@ -12738,7 +12619,8 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - G_AGP x-window-system-core wmaker gnustep gnustep-devel gnustep-games upower policykit-1 firefox-esr + apt-mark auto upower policykit-1 firefox-esr + G_AGP x-window-system-core wmaker gnustep gnustep-devel gnustep-games fi @@ -12746,7 +12628,8 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - G_AGP xfce4 gnome-icon-theme tango-icon-theme firefox-esr + apt-mark auto gnome-icon-theme tango-icon-theme firefox-esr + G_AGP xfce4 fi @@ -12790,6 +12673,9 @@ _EOF_ Banner_Uninstalling # Remove background cron job crontab -u www-data -l | grep -v '/var/www/owncloud/cron.php' | crontab -u www-data - + # Disable and remove PHP modules + phpdismod dietpi-owncloud &> /dev/null + rm -f /etc/php/*/mods-available/dietpi-owncloud.ini # Disable and remove webserver configs a2dissite dietpi-owncloud 2> /dev/null rm /etc/apache2/sites-available/dietpi-owncloud.conf 2> /dev/null @@ -12828,13 +12714,13 @@ _EOF_ fi - software_id=168 # Nextcloud Talk + TURN server "coturn" + software_id=168 # Nextcloud Talk + coTURN server if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling G_AGP coturn - [[ -f /etc/turnserver.conf ]] && rm /etc/turnserver.conf - [[ -d /etc/systemd/system/coturn.service.d ]] && rm -R /etc/systemd/system/coturn.service.d + [[ -f '/etc/turnserver.conf' ]] && rm /etc/turnserver.conf + [[ -d '/etc/systemd/system/coturn.service.d' ]] && rm -R /etc/systemd/system/coturn.service.d systemctl start $MARIADB_SERVICE systemctl start redis-server ncc maintenance:mode --off @@ -12848,6 +12734,9 @@ _EOF_ Banner_Uninstalling crontab -u www-data -l | grep -v '/var/www/nextcloud/cron.php' | crontab -u www-data - + # Disable and remove PHP modules + phpdismod dietpi-nextcloud &> /dev/null + rm -f /etc/php/*/mods-available/dietpi-nextcloud.ini # Disable and remove webserver configs a2dissite dietpi-nextcloud 2> /dev/null rm /etc/apache2/sites-available/dietpi-nextcloud.conf 2> /dev/null @@ -12921,7 +12810,7 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - G_AGP sqlite3 + G_AGP sqlite3 php*-sqlite3 fi @@ -12929,22 +12818,22 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - G_AGP "$PHP_BINARY"-redis redis-server redis-tools + G_AGP redis-server redis-tools php*-redis + [[ -d '/etc/systemd/system/redis-server.service.d' ]] && rm -R /etc/systemd/system/redis-server.service.d # Jessie permissions fix fi - software_id=89 + software_id=89 # PHP if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - rm $FP_PHP_BASE_DIR/fpm/pool.d/www.conf 2> /dev/null - rm $FP_PHP_BASE_DIR/mods-available/dietpi.ini 2> /dev/null - G_AGP $(dpkg --get-selections | grep -E '(php[0-9]?\.?[0-9]?-*|libapache2-mod-php*)' | mawk '{print $1}') - rm /var/www/phpinfo.php - rm /var/www/apc.php - rm /var/www/opcache.php + G_AGP $(dpkg --get-selections | grep -E '^(php[0-9.]*-|libapache2-mod-php)' | mawk '{print $1}') + [[ -d '/etc/php' ]] && rm -R /etc/php + [[ -f '/var/www/phpinfo.php' ]] && rm /var/www/phpinfo.php + [[ -f '/var/www/apc.php' ]] && rm /var/www/apc.php + [[ -f '/var/www/opcache.php' ]] && rm /var/www/opcache.php # temp php uploads, if it was created - rm -R /var/tmp/php_upload_tmp 2> /dev/null + [[ -d '/var/tmp/php_upload_tmp' ]] && rm -R /var/tmp/php_upload_tmp fi @@ -12966,7 +12855,7 @@ _EOF_ systemctl start $MARIADB_SERVICE mysqladmin drop phpbb3 -f mysql -e "drop user 'phpbb3'@'localhost'" - rm -R /var/www/phpBB3 + [[ -d '/var/www/phpBB3' ]] && rm -R /var/www/phpBB3 fi @@ -13373,7 +13262,6 @@ _EOF_ fi - software_id=121 if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then @@ -13456,10 +13344,19 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - G_AGP ibsdl1.2debian libsdl-net1.2 - rm -R /usr/local/games/opentyrian + if (( $G_HW_MODEL >= 10 )); then + + G_AGP opentyrian + + else + + G_AGP ibsdl1.2debian libsdl-net1.2 + + fi + rm /usr/share/applications/opentyrian.desktop rm /root/Desktop/opentyrian.desktop + rm -R /usr/games/opentyrian fi @@ -13585,6 +13482,7 @@ _EOF_ Banner_Uninstalling G_AGP subsonic + getent passwd subsonic &> /dev/null && userdel -rf subsonic [[ -d /var/subsonic ]] && rm -R /var/subsonic fi @@ -13639,15 +13537,15 @@ _EOF_ fi - software_id=35 + software_id=35 # Logitech Media Server if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - #apt-mark auto libxml-parser-perl zlib1g-dev libjpeg-dev libpng-dev libjpeg62-turbo-dev &> /dev/null G_AGP logitechmediaserver - rm /etc/systemd/system/squeezeboxserver.service - rm -R /var/lib/squeezeboxserver - rm -R /usr/share/squeezeboxserver + getent passwd squeezeboxserver &> /dev/null && userdel -rf squeezeboxserver + [[ -f '/etc/systemd/system/logitechmediaserver.service' ]] && rm /etc/systemd/system/logitechmediaserver.service + [[ -d '/var/lib/squeezeboxserver' ]] && rm -R /var/lib/squeezeboxserver + [[ -d '/usr/share/squeezeboxserver' ]] && rm -R /usr/share/squeezeboxserver fi @@ -13702,11 +13600,13 @@ _EOF_ fi - software_id=73 + software_id=73 # Fail2Ban if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling G_AGP fail2ban + apt-mark auto python3-systemd + [[ -d '/etc/fail2ban' ]] && rm -R /etc/fail2ban fi @@ -13768,11 +13668,10 @@ _EOF_ [[ -d /etc/wireguard ]] && rm -R /etc/wireguard [[ -f /etc/apt/sources.list.d/dietpi-wireguard.list ]] && rm /etc/apt/sources.list.d/dietpi-wireguard.list [[ -f /etc/apt/preferences.d/dietpi-wireguard ]] && rm /etc/apt/preferences.d/dietpi-wireguard - [[ -f /etc/sysctl.d/dietpi-wireguard.conf ]] && rm /etc/sysctl.d/dietpi-wireguard.conf fi - software_id=171 + software_id=171 # DietPi-NordVPN if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling @@ -13816,7 +13715,6 @@ _EOF_ Banner_Uninstalling G_AGP i2c-tools - #Disable /DietPi/dietpi/func/dietpi-set_hardware i2c disable fi @@ -13891,10 +13789,10 @@ _EOF_ Banner_Uninstalling #apt-mark auto libssl1.0.0 openssl libsoxr0 libavahi-client3 libtool libconfig9 libpopt0 libdaemon0 &> /dev/null - # No package is installed anymore, files are directly extracted into places, need to remove them manually? + # No package is installed any more, files are directly extracted into places, need to remove them manually? # https://github.com/MichaIng/DietPi/blob/testing/dietpi/dietpi-software#L5968 #G_AGP shairport-sync - rm /lib/systemd/system/shairport-sync.service /usr/local/bin/shairport-sync /usr/local/etc/shairport-sync.conf* /usr/local/share/man/man7/shairport-sync.7.gz &> /dev/null + rm -f /lib/systemd/system/shairport-sync.service /usr/local/bin/shairport-sync /usr/local/etc/shairport-sync.conf* /usr/local/share/man/man7/shairport-sync.7.gz userdel -rf shairport-sync fi @@ -13925,7 +13823,7 @@ _EOF_ Banner_Uninstalling G_AGP squeezelite - rm -R /usr/bin/squeezelite* + rm -Rf /usr/bin/squeezelite* rm /etc/systemd/system/squeezelite.service fi @@ -14019,14 +13917,13 @@ _EOF_ fi - software_id=58 + software_id=58 # OpenBazaar if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - - rm /etc/systemd/system/openbazaar.service - rm -R $G_FP_DIETPI_USERDATA/go/src/github.com/OpenBazaar - rm -R /etc/openbazaar-server &> /dev/null # Pre v6.15 OB1.0 + [[ -f '/etc/systemd/system/openbazaar.service' ]] && rm /etc/systemd/system/openbazaar.service + [[ -d $G_FP_DIETPI_USERDATA/go/src/github.com/OpenBazaar ]] && rm -R $G_FP_DIETPI_USERDATA/go/src/github.com/OpenBazaar + [[ -d '/etc/openbazaar-server' ]] && rm -R /etc/openbazaar-server # Pre v6.15 OB1.0 fi @@ -14034,10 +13931,9 @@ _EOF_ if (( ${aSOFTWARE_INSTALL_STATE[$software_id]} == -1 )); then Banner_Uninstalling - G_AGP $(dpkg --get-selections plexmediaserver* | mawk '{print $1}') - [[ -d /etc/systemd/system/plexmediaserver.service.d ]] && rm -R /etc/systemd/system/plexmediaserver.service.d # post v6.17 - [[ -d /var/lib/plexmediaserver ]] && rm -R /var/lib/plexmediaserver # pre v6.22 Plex v1.15 - [[ -f etc/apt/sources.list.d/plex.list ]] && rm /etc/apt/sources.list.d/plex.list && G_AGUP # pre v6.22 + G_AGP plexmediaserver + [[ -d '/var/lib/plexmediaserver' ]] && rm -R /var/lib/plexmediaserver # Left over from purging package, still... + [[ -d '/etc/systemd/system/plexmediaserver.service.d' ]] && rm -R /etc/systemd/system/plexmediaserver.service.d fi @@ -14381,7 +14277,7 @@ _EOF_ # On Jessie, purging MariaDB server with unix_socket authentication fails, thus revert to password: (( $G_DISTRO < 4 )) && mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by '$GLOBAL_PW' with grant option;flush privileges" systemctl stop $MARIADB_SERVICE - G_AGP mariadb-server + G_AGP mariadb-server php*-mysql # - config folder rm -R /etc/mysql 2> /dev/null @@ -14399,7 +14295,7 @@ _EOF_ Banner_Uninstalling G_AGP influxdb - rm /etc/apt/sources.list.d/influxdb.list && G_AGUP + rm /etc/apt/sources.list.d/influxdb.list rm -R /var/lib/influxdb rm -R $G_FP_DIETPI_USERDATA/influxdb @@ -14448,7 +14344,6 @@ _EOF_ fi - #---------------------------------------------------------------------- #LINUX SOFTWARE @@ -14548,9 +14443,9 @@ _EOF_ Banner_Uninstalling umount -f /mnt/samba G_AGP smbclient - #Disable in fstab + # Disable in fstab sed -i '/\/mnt\/samba/c\#\/mnt\/samba . Please use dietpi-drive_manager to setup this mount' /etc/fstab - #Add info file for installation method. + # Add info file for installation method. echo -e 'Samba client can be installed and setup by DietPi-Drive_Manager.\nSimply run: dietpi-drive_manager and select the "Add network drive" option.' > /mnt/samba/readme.txt fi @@ -14586,10 +14481,10 @@ _EOF_ fi - #Disable in fstab + # Disable in fstab sed -i '/\/mnt\/nfs_client/c\#\/mnt\/nfs_client . Please use DietPi-Drive_Manager to setup this mount' /etc/fstab - #Add info file for installation method. + # Add info file for installation method. echo -e 'NFS client can be installed and setup by DietPi-Drive_Manager.\nSimply run: dietpi-drive_manager and select the "Add network drive" option.' > /mnt/nfs_client/readme.txt fi @@ -14686,7 +14581,7 @@ Before=dietpi-preboot.service rsyslog.service syslog.service [Service] Type=oneshot StandardOutput=tty -ExecStart=/bin/bash -c '/var/lib/dietpi/dietpi-ramlog/disable.sh &> /var/tmp/dietpi/logs/dietpi-ramlog_disable_debug.log' +ExecStart=/bin/dash -c '/var/lib/dietpi/dietpi-ramlog/disable.sh 2>&1 > /var/tmp/dietpi/logs/dietpi-ramlog_disable_debug.log' [Install] WantedBy=local-fs.target @@ -14734,12 +14629,7 @@ _EOF_ G_AGP nodejs # - old install via repo - if [[ -f /etc/apt/sources.list.d/nodesource_nodejs.list ]]; then - - rm /etc/apt/sources.list.d/nodesource_nodejs.list - G_AGUP - - fi + [[ -f '/etc/apt/sources.list.d/nodesource_nodejs.list' ]] && rm /etc/apt/sources.list.d/nodesource_nodejs.list [[ -f /usr/local/bin/node ]] && rm /usr/local/bin/node [[ -d /usr/local/n ]] && rm -R /usr/local/n @@ -14841,7 +14731,7 @@ _EOF_ # Unmask all services: https://github.com/MichaIng/DietPi/issues/1320 DISABLE_SERVICES_START=1 /DietPi/dietpi/dietpi-services unmask all # Stop services - /DietPi/dietpi/dietpi-services stop + [[ $G_SERVICE_CONTROL == 0 ]] || /DietPi/dietpi/dietpi-services stop #------------------------------------------------------------ #Generate userdata folders: Create_UserContent_Folders @@ -15010,7 +14900,7 @@ _EOF_ FirstRun_Automation_Init(){ - #Get settings + # Get settings AUTOINSTALL_ENABLED=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_AUTOMATED=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') AUTOINSTALL_AUTOSTARTTARGET=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_AUTOSTART_TARGET_INDEX=' /DietPi/dietpi.txt | sed 's/^[^=]*=//' ) AUTOINSTALL_SSHINDEX=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SSH_SERVER_INDEX=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') @@ -15028,13 +14918,13 @@ _EOF_ G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" 'Running automated installation' - #Skip dietpi-software menu + # Skip dietpi-software menu TARGETMENUID=-1 - #Set start install + # Set start install GOSTARTINSTALL=1 - #Find all software entries of AUTO_SETUP_INSTALL_SOFTWARE_ID= in dietpi.txt. Then set to state 1 for installation. + # Find all software entries of AUTO_SETUP_INSTALL_SOFTWARE_ID= in dietpi.txt. Then set to state 1 for installation. while read -r software_id do @@ -15051,13 +14941,13 @@ _EOF_ fi - #Further Automated options. (Applied regardless of AUTOINSTALL_ENABLED) + # Further Automated options. (Applied regardless of AUTOINSTALL_ENABLED) INDEX_SSHSERVER_TARGET=$AUTOINSTALL_SSHINDEX INDEX_FILESERVER_TARGET=$AUTOINSTALL_FILESERVERINDEX INDEX_LOGGING_TARGET=$AUTOINSTALL_LOGGINGINDEX INDEX_WEBSERVER_TARGET=$AUTOINSTALL_WEBSERVERINDEX - #Re-flag RAMlog for install, if enabled, ensures AUTO_SETUP_RAMLOG_MAXSIZE gets applied + # Re-flag RAMlog for install, if enabled, ensures AUTO_SETUP_RAMLOG_MAXSIZE gets applied if (( $INDEX_LOGGING_TARGET == -1 || $INDEX_LOGGING_TARGET == -2 )); then aSOFTWARE_INSTALL_STATE[103]=1 @@ -15079,7 +14969,7 @@ _EOF_ local input=$@ input=${input#*[[:blank:]]} - #Install software and exit. + # Install software and exit. if [[ $1 == 'install' || $1 == 'reinstall' || $1 == 'uninstall' ]]; then G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" "Automated $1" @@ -15092,14 +14982,14 @@ _EOF_ else # - Uninstall | Stop services prior - [[ $1 == 'uninstall' ]] && /DietPi/dietpi/dietpi-services stop + [[ $1 == 'uninstall' && $G_SERVICE_CONTROL != 0 ]] && /DietPi/dietpi/dietpi-services stop # - Process inputs for i in $input do # - Check if input software ID exists, install state was defined - if disable_error=1 G_CHECK_VALIDINT $i 0 + if disable_error=1 G_CHECK_VALIDINT $i 0 && disable_error=1 G_CHECK_VALIDINT ${aSOFTWARE_INSTALL_STATE[$i]}; then if [[ $1 == 'uninstall' ]]; then @@ -15174,71 +15064,46 @@ _EOF_ # - Reinstall, prompt for backup if [[ $1 == 'reinstall' ]]; then - if (( $GOSTARTINSTALL )); then - - G_PROMPT_BACKUP - - fi + (( $GOSTARTINSTALL )) && G_PROMPT_BACKUP # - Uninstall | Finish up and clear non-required packages elif [[ $1 == 'uninstall' ]]; then Uninstall_Software - #Save + # - Save Write_InstallFileList # - Start services - /DietPi/dietpi/dietpi-services start + [[ $G_SERVICE_CONTROL == 0 ]] || /DietPi/dietpi/dietpi-services start fi fi - #List unique software names and ID's + # List software IDs, names and additional info elif [[ $1 == 'list' ]]; then for i in ${!aSOFTWARE_INSTALL_STATE[@]} do - local string='' - - if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 2 )); then - - string="\e[32mID $i | " - - else - - string="\e[0mID $i | " - - fi + local string="\e[0mID $i | " + (( ${aSOFTWARE_INSTALL_STATE[$i]} == 2 )) && string="\e[32mID $i | " string+="=${aSOFTWARE_INSTALL_STATE[$i]} | ${aSOFTWARE_WHIP_NAME[$i]}:\e[0m \e[90m${aSOFTWARE_WHIP_DESC[$i]}\e[0m |" (( ${aSOFTWARE_REQUIRES_ALSA[$i]:=0} == 1 )) && string+=' +ALSA' - (( ${aSOFTWARE_REQUIRES_XSERVERXORG[$i]:=0} == 1 )) && string+=' +XSERVER' - (( ${aSOFTWARE_REQUIRES_DESKTOP[$i]:=0} == 1 )) && string+=' +DESKTOP' - (( ${aSOFTWARE_REQUIRES_RSYSLOG[$i]:=0} == 1 )) && string+=' +RSYSLOG' - (( ${aSOFTWARE_REQUIRES_FFMPEG[$i]:=0} == 1 )) && string+=' +FFMPEG' - - (( ${aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$i]:=0} == 1 )) && string+=' +ORACLEJAVA' - + (( ${aSOFTWARE_REQUIRES_JAVA_JRE_JDK[$i]:=0} == 1 )) && string+=' +JAVA' (( ${aSOFTWARE_REQUIRES_NODEJS[$i]:=0} == 1 )) && string+=' +NODEJS' - (( ${aSOFTWARE_REQUIRES_BUILDESSENTIAL[$i]:=0} == 1 )) && string+=' +BUILDESSENTIAL' - (( ${aSOFTWARE_REQUIRES_GIT[$i]:=0} == 1 )) && string+=' +GIT' - (( ${aSOFTWARE_REQUIRES_WEBSERVER[$i]:=0} == 1 )) && string+=' +WEBSERVER' - (( ${aSOFTWARE_REQUIRES_PHP[$i]:=0} == 1 )) && string+=' +PHP' - (( ${aSOFTWARE_REQUIRES_MYSQL[$i]:=0} == 1 )) && string+=' +MARIADB' - (( ${aSOFTWARE_REQUIRES_SQLITE[$i]:=0} == 1 )) && string+=' +SQLITE' # - Available for G_HW_ARCH? @@ -15261,11 +15126,23 @@ _EOF_ # - Online docs [[ ${aSOFTWARE_ONLINEDOC_URL[$i]} ]] && string+=" | \e[90m$FP_ONLINEDOC_URL${aSOFTWARE_ONLINEDOC_URL[$i]}\e[0m" - #Convert string to lowercase + # - Convert string to lowercase echo -e "${string,,}" done + elif [[ $1 == 'free' ]]; then + + # Get highest software array index + local max=0 + for max in ${!aSOFTWARE_INSTALL_STATE[@]}; do :; done + + # Check for unused indices + local free='' + for (( i=0; i<=$max; i++ )); do [[ ${aSOFTWARE_INSTALL_STATE[$i]} ]] || free+=" $i"; done + + echo "Free software ID(s):${free:- None, so use $(($max+1))!}" + else G_DIETPI-NOTIFY 2 "Unknown command $1" @@ -15282,11 +15159,11 @@ _EOF_ Menu_CreateSoftwareList(){ - #software type for this menu + # Software type for this menu local input_mode=$1 #-1=search all mode #0=dietpi 1=linux local display_software_menu=1 #only used to disable display of CHECKLIST when search finds no results - #Search Mode + # Search Mode if (( $input_mode == -1 )); then local search_string='' #show all @@ -15316,8 +15193,6 @@ _EOF_ fi - echo $i - G_WHIP_CHECKLIST_ARRAY+=($i "${aSOFTWARE_WHIP_NAME[$i]}: ${aSOFTWARE_WHIP_DESC[$i]}" "$selected") display_software_menu=1 @@ -15329,7 +15204,7 @@ _EOF_ fi - #Generate Whiptail menu list, of all items in specific software type, based on category + # Generate Whiptail menu list, of all items in specific software type, based on category else # - Prewarnings - Linux @@ -15353,14 +15228,14 @@ _EOF_ for ((i=0; i<$max_categories; i++)) do - #Only add the category if we have software for it. + # Only add the category if we have software for it. local category_enabled=0 - #Now run through all available software + # Now run through all available software for j in ${!aSOFTWARE_CATEGORY_INDEX[@]} do - #Check if this software matches the current category and software type for this menu. + # Check if this software matches the current category and software type for this menu. if (( ${aSOFTWARE_CATEGORY_INDEX[$j]} == $i && ${aSOFTWARE_TYPE[$j]} == $input_mode )); then # + is available for hardware? @@ -15403,7 +15278,7 @@ _EOF_ fi - #Add this option to whiptail list + # Add this option to whiptail list G_WHIP_CHECKLIST_ARRAY+=($j "${aSOFTWARE_WHIP_NAME[$j]}: ${aSOFTWARE_WHIP_DESC[$j]}" $selected) fi @@ -15423,10 +15298,10 @@ _EOF_ G_WHIP_CHECKLIST "Please use the spacebar to select the software you wish to install.\n - Software and usage details: https://dietpi.com/software - NB: Pressing 'ESC' or selecting 'Back' will clear all changed selections" - #Reset Choices made flag + # Reset Choices made flag INSTALL_SOFTWARE_CHOICESMADE=0 - #Check for matching results (selected items) + # Check for matching results (selected items) for i in ${G_WHIP_RETURNED_VALUE[@]} do @@ -15441,9 +15316,9 @@ _EOF_ done #----------------------------------------------------------------------------- - #Install Info/Warnings + # Install Info/Warnings - #DietPi-Drive_Manager can be used to setup Samba/NFS shares with ease! + # DietPi-Drive_Manager can be used to setup Samba/NFS shares with ease! if (( ${aSOFTWARE_INSTALL_STATE[1]} == 1 || ${aSOFTWARE_INSTALL_STATE[110]} == 1 )); then G_WHIP_MSG "NFS/Samba client info:\n\nDietPi-Drive_Manager is a powerful tool which vastly simplifies the mounting of NFS and Samba shares.\n @@ -15451,7 +15326,7 @@ Once $G_PROGRAM_NAME has finished installation, simply run 'dietpi-drive_manager fi - #Gogs: Requires OpenSSH for ssh-keygen binary: https://github.com/MichaIng/DietPi/issues/442 + # Gogs: Requires OpenSSH for ssh-keygen binary: https://github.com/MichaIng/DietPi/issues/442 if (( ${aSOFTWARE_INSTALL_STATE[49]} == 1 && $INDEX_SSHSERVER_TARGET != -2 )); then if G_WHIP_YESNO "Gogs requires OpenSSH server to function.\n\nIf you continue, OpenSSH will be selected for install on your system. OpenSSH will also replace Dropbear (if currently installed).\n @@ -15468,7 +15343,7 @@ Would you like to continue with the Gogs installation?"; then fi - #Webserver stacks + # Webserver stacks for i in 75 76 78 79 81 82 do @@ -15484,7 +15359,7 @@ TLDR: You do NOT need to select a webserver stack for installation with DietPi. done - #RPiCamInterface - warn user of locking out camera: https://github.com/MichaIng/DietPi/issues/249 + # RPiCamInterface - warn user of locking out camera: https://github.com/MichaIng/DietPi/issues/249 if (( ${aSOFTWARE_INSTALL_STATE[59]} == 1 )); then G_WHIP_MSG 'RPi Cam Control Interface will automatically start and activate the camera during boot. This will prevent other programs (eg: raspistill) from using the camera.\n @@ -15492,7 +15367,7 @@ You can free up the camera by selecting "Stop Camera" from the web interface:\n fi - #EmonHUB/EmonPi + # EmonHUB/EmonPi if (( ${aSOFTWARE_INSTALL_STATE[99]} == 1 )); then # - Enter API KEY @@ -15501,7 +15376,7 @@ You can free up the camera by selecting "Stop Camera" from the web interface:\n while (( $USER_EMONHUB_APIKEY_COMPLETED == 0 )); do - G_WHIP_INPUTBOX "EmonHUB/EmonPi:\n\nPlease enter the \"Write API KEY\":\n - Visit http://emoncms.org to register an account and login. + G_WHIP_INPUTBOX "EmonHUB/EmonPi:\n\nPlease enter the \"Write API KEY\":\n - Visit https://emoncms.org to register an account and login. - Select \"Setup\" from the top right of screen, then select \"My Account\"\n - Enter the \"Write API Key\" into the box below." if (( $? == 0 )); then @@ -15523,7 +15398,7 @@ You can free up the camera by selecting "Stop Camera" from the web interface:\n fi - #Pi-hole. + # Pi-hole if (( ${aSOFTWARE_INSTALL_STATE[93]} == 1 )); then # - prompt for static ip. @@ -15540,10 +15415,10 @@ Once completed, select "Apply Save Changes", then exit DietPi-Config to resume s fi - #Wifi Hotspot Criteria + # WiFi Hotspot Criteria if (( ${aSOFTWARE_INSTALL_STATE[60]} == 1 || ${aSOFTWARE_INSTALL_STATE[61]} == 1 )); then - #Enable wifi modules + # Enable WiFi modules /DietPi/dietpi/func/dietpi-set_hardware wifimodules enable while :; do @@ -15573,14 +15448,14 @@ Once completed, select "Apply Save Changes", then exit DietPi-Config to resume s fi - #Passed + # Passed if (( $criteria_passed )); then output_string+='\n\nPASSED: Criteria met. Good to go.' G_WHIP_MSG "$output_string" break - #Failed, retry? + # Failed, retry? else output_string+='\n\nFAILED: Criteria not met. Would you like to check again?' @@ -15599,7 +15474,7 @@ Once completed, select "Apply Save Changes", then exit DietPi-Config to resume s fi - #Weaved + # Weaved/Remot3.it if (( ${aSOFTWARE_INSTALL_STATE[68]} == 1 )); then G_WHIP_MSG 'Remot3.it requires you to create an online account, and, link it this device.\n @@ -15607,7 +15482,7 @@ Once DietPi has completed your software installations, and rebooted, please foll fi - #LetsEncrypt + # Let's Encrypt if (( ${aSOFTWARE_INSTALL_STATE[92]} == 1 )); then G_WHIP_MSG 'The DietPi installation of CertBot supports all offered web servers.\n\nOnce the installation has finished, you can setup your free SSL cert with: @@ -15615,7 +15490,7 @@ Once DietPi has completed your software installations, and rebooted, please foll fi - #dietpi-config can be used to install/configure the following software. Ask user. + # dietpi-config can be used to install/configure the following software. Ask user. # NoIp if (( ${aSOFTWARE_INSTALL_STATE[67]} == 1 )); then @@ -15635,7 +15510,7 @@ Once DietPi has completed your software installations, and rebooted, please foll fi - #Boot Choices + # Boot Choices if (( ${aSOFTWARE_INSTALL_STATE[23]} == 1 || ${aSOFTWARE_INSTALL_STATE[24]} == 1 || ${aSOFTWARE_INSTALL_STATE[25]} == 1 || @@ -15645,7 +15520,8 @@ Once DietPi has completed your software installations, and rebooted, please foll ${aSOFTWARE_INSTALL_STATE[108]} == 1 || ${aSOFTWARE_INSTALL_STATE[112]} == 1 || ${aSOFTWARE_INSTALL_STATE[119]} == 1 || - ${aSOFTWARE_INSTALL_STATE[155]} == 1 )); then + ${aSOFTWARE_INSTALL_STATE[155]} == 1 || + ${aSOFTWARE_INSTALL_STATE[173]} == 1 )); then # Set Boot Order G_WHIP_YESNO 'Would you like to configure the auto boot options for DietPi?\n @@ -15660,7 +15536,7 @@ This will allow you to choose which program loads automatically, after the syste Menu_Main(){ - #Data for storing SSH server index info + # Data for storing SSH server index info local index_sshserver_text='None' if (( $INDEX_SSHSERVER_TARGET == -1 )); then @@ -15672,7 +15548,7 @@ This will allow you to choose which program loads automatically, after the syste fi - #Data for storing Fileserver index info + # Data for storing Fileserver index info local index_fileserver_text='None' if (( $INDEX_FILESERVER_TARGET == -1 )); then @@ -15684,7 +15560,7 @@ This will allow you to choose which program loads automatically, after the syste fi - #Data for storing Logging index info + # Data for storing Logging index info local index_logging_text='None' if (( $INDEX_LOGGING_TARGET == -1 )); then @@ -15700,13 +15576,13 @@ This will allow you to choose which program loads automatically, after the syste fi - #Hold our string that tells the user what software will be removed when using Index based choice systems + # Hold our string that tells the user what software will be removed when using Index based choice systems local toberemoved_text='' - #Check status of USB drive + # Check status of USB drive Check_USB_Drive_Installed - #Where is userdata stored? + # Where is userdata stored? local user_data_location_current=$(readlink -f $G_FP_DIETPI_USERDATA) local user_data_location_description='' @@ -15831,7 +15707,7 @@ This will allow you to choose which program loads automatically, after the syste fi - #Check for changes + # Check for changes INSTALL_SSHSERVER_CHOICESMADE=0 if (( $INDEX_SSHSERVER_TARGET != $INDEX_SSHSERVER_CURRENT )); then @@ -15886,7 +15762,7 @@ This will allow you to choose which program loads automatically, after the syste fi - #Check for changes + # Check for changes INSTALL_FILESERVER_CHOICESMADE=0 if (( $INDEX_FILESERVER_TARGET != $INDEX_FILESERVER_CURRENT )); then @@ -15948,7 +15824,7 @@ This will allow you to choose which program loads automatically, after the syste fi - #Check for changes + # Check for changes INSTALL_LOGGING_CHOICESMADE=0 if (( $INDEX_LOGGING_TARGET != $INDEX_LOGGING_CURRENT )); then @@ -16066,14 +15942,14 @@ More information on user data in DietPi:\n- https://dietpi.com/phpbb/viewtopic.p INDEX_WEBSERVER_TARGET=-2 - #Reset to current + # Reset to current else INDEX_WEBSERVER_TARGET=$INDEX_WEBSERVER_CURRENT fi - #Check for changes + # Check for changes if (( $INDEX_WEBSERVER_TARGET != $INDEX_WEBSERVER_CURRENT )); then # - Check for existing and compatible installed stacks before allowing the change @@ -16109,7 +15985,6 @@ More information on user data in DietPi:\n- https://dietpi.com/phpbb/viewtopic.p G_WHIP_MSG "Error: Incompatible Webserver Preference:\n\nUnable to change your webserver preference to $G_WHIP_RETURNED_VALUE.\n This is due to an existing and incompatible webserver installation on your system ($info_currently_installed_webserver). Please remove all webserver based software (using dietpi-software > uninstall), before trying again." - # - Apply preference selection else @@ -16179,7 +16054,7 @@ When you select any software for install that requires a webserver, DietPi will esac - #Exit/Abort Setup + # Exit/Abort Setup else Menu_Exit @@ -16190,21 +16065,20 @@ When you select any software for install that requires a webserver, DietPi will Menu_Exit(){ - #Return to Main Menu - TARGETMENUID=0 + TARGETMENUID=0 # Return to Main Menu - #1st run install + # 1st run install if (( $G_DIETPI_INSTALL_STAGE == 1 )); then G_WHIP_MSG 'DietPi has not fully been installed.\nThis must be completed prior to using DietPi by selecting:\n - Go Start Install.' - #Standard exit + # Standard exit elif (( $G_DIETPI_INSTALL_STAGE == 2 )); then if G_WHIP_YESNO 'Do you wish to exit DietPi-Software?\n\nAll changes to software selections will be cleared.'; then Banner_Aborted - #Exit script NOW + # Exit script NOW exit fi @@ -16215,7 +16089,7 @@ When you select any software for install that requires a webserver, DietPi will Menu_ConfirmInstall(){ - #Obtain list of pending software installation: + # Obtain list of pending software installation: local string_output='' for i in ${!aSOFTWARE_INSTALL_STATE[@]} do @@ -16227,23 +16101,21 @@ When you select any software for install that requires a webserver, DietPi will fi done + [[ $G_SERVICE_CONTROL == 0 ]] || string_output+='\nNB: Software services will be temporarily controlled (stopped) by DietPi during this process. Please inform connected users, before continuing. SSH is not affected.' - #Confirm Software install + # Confirm Software install if G_WHIP_YESNO "DietPi is now ready to install your software choices: $string_output\n -Software details, usernames, passwords etc:\n - https://dietpi.com/software\n -NB: Software services will be temporarily controlled (stopped) by DietPi during this process. Please inform connected users, before continuing. SSH is not affected.\n -Would you like to begin?"; then +Software details, usernames, passwords etc:\n - https://dietpi.com/software\n\nWould you like to begin?"; then - #exit menu system + # Exit menu system TARGETMENUID=-1 - #Enable installation start flag + # Enable installation start flag GOSTARTINSTALL=1 else - #Return to Main Menu - TARGETMENUID=0 + TARGETMENUID=0 # Return to Main Menu fi @@ -16251,7 +16123,7 @@ Would you like to begin?"; then Menu_StartInstall(){ - #Check if the user has made changes to their software selections. + # Check if the user has made changes to their software selections. if (( $INSTALL_SOFTWARE_CHOICESMADE || $INSTALL_SSHSERVER_CHOICESMADE || $INSTALL_FILESERVER_CHOICESMADE || @@ -16262,7 +16134,7 @@ Would you like to begin?"; then else - #1st run install + # 1st run install if (( $G_DIETPI_INSTALL_STAGE == 1 )); then G_WHIP_YESNO 'DietPi was unable to detect any additional software selections for install.\n @@ -16284,7 +16156,7 @@ NB: You can use dietpi-software at a later date, to install optimized software f fi - #Not 1st run + # Not 1st run elif (( $G_DIETPI_INSTALL_STAGE == 2 )); then G_WHIP_MSG 'No changes have been detected. Unable to start installation.' @@ -16295,38 +16167,35 @@ NB: You can use dietpi-software at a later date, to install optimized software f } - #TARGETMENUID=1 + # TARGETMENUID=1 Menu_Dietpi_Software(){ - #Generate Whiptail menu and store results into our software arrays + # Generate Whiptail menu and store results into our software arrays Menu_CreateSoftwareList 0 - #Return to Main Menu - TARGETMENUID=0 + TARGETMENUID=0 # Return to Main Menu } - #TARGETMENUID=2 + # TARGETMENUID=2 Menu_Linux_Software(){ - #Generate Whiptail menu and store results into our software arrays + # Generate Whiptail menu and store results into our software arrays Menu_CreateSoftwareList 1 - #Return to Main Menu - TARGETMENUID=0 + TARGETMENUID=0 # Return to Main Menu } - #TARGETMENUID=3 + # TARGETMENUID=3 Menu_Uninstall_Software(){ - #Return to main menu - TARGETMENUID=0 + TARGETMENUID=0 # Return to Main Menu - #Array which will hold all software IDs to be removed. + # Array which will hold all software IDs to be removed. G_WHIP_CHECKLIST_ARRAY=() - #Obtain list of installed software + # Obtain list of installed software local software_available_for_uninstall=0 for i in ${!aSOFTWARE_INSTALL_STATE[@]} do @@ -16341,12 +16210,12 @@ NB: You can use dietpi-software at a later date, to install optimized software f done - #No software installed + # No software installed if (( ! $software_available_for_uninstall )); then G_WHIP_MSG 'No software is currently installed, or, available for removal.' - #Run menu + # Run menu else G_WHIP_BUTTON_CANCEL_TEXT='Back' @@ -16361,14 +16230,14 @@ NB: You can use dietpi-software at a later date, to install optimized software f UNINSTALL_REQUIRED=1 done + [[ $G_SERVICE_CONTROL == 0 ]] || output_string+='\nNB: Software services will be temporarily controlled (stopped) by DietPi during this process. Please inform connected users, before continuing. SSH is not affected.' if (( $UNINSTALL_REQUIRED )); then - G_WHIP_YESNO "$output_string \n\nNB: Software services will be temporarily controlled (stopped) by DietPi during this process. Please inform connected users, before continuing. SSH is not affected.\n\nDo you wish to continue?" - if (( $? == 0 )); then + if G_WHIP_YESNO "$output_string\n\nDo you wish to continue?"; then - # - stop services - /DietPi/dietpi/dietpi-services stop + # - Stop services + [[ $G_SERVICE_CONTROL == 0 ]] || /DietPi/dietpi/dietpi-services stop # - Run uninstall for i in ${G_WHIP_RETURNED_VALUE[@]} @@ -16379,11 +16248,11 @@ NB: You can use dietpi-software at a later date, to install optimized software f done Uninstall_Software - #Save + # - Save Write_InstallFileList - # - start services - /DietPi/dietpi/dietpi-services start + # - Start services + [[ $G_SERVICE_CONTROL == 0 ]] || /DietPi/dietpi/dietpi-services start G_WHIP_MSG 'Uninstall completed.' @@ -16447,13 +16316,13 @@ NB: You can use dietpi-software at a later date, to install optimized software f Banner_Aborted(){ - #1st run abort + # 1st run abort if (( $G_DIETPI_INSTALL_STAGE == 1 )); then /DietPi/dietpi/func/dietpi-banner 0 G_DIETPI-NOTIFY 1 '\n Installation aborted by user.\n Installation must be completed prior to using DietPi.\n Please run dietpi-software to restart the installation.\n' - #Standard abort + # Standard abort else /DietPi/dietpi/func/dietpi-banner 1 @@ -16466,26 +16335,26 @@ NB: You can use dietpi-software at a later date, to install optimized software f # Main Loop #///////////////////////////////////////////////////////////////////////////////////// #-------------------------------------------------------------------------------------- - #Init software arrays + # Init software arrays Software_Arrays_Init #-------------------------------------------------------------------------------------- - #load .installed file, update vars, if it exists + # Load .installed file, update vars, if it exists Read_InstallFileList #-------------------------------------------------------------------------------------- - #Update GLOBAL_PW + # Update GLOBAL_PW Update_Global_Pw #-------------------------------------------------------------------------------------- - # - CLi input mode + # - CLI input mode if [[ $1 ]]; then # - Run input mode Input_Modes "$@" #-------------------------------------------------------------------------------------- - #Standard launch + # Standard launch else - #1st run dietpi-software + # 1st run dietpi-software if (( $G_DIETPI_INSTALL_STAGE == 1 )); then # - Load all automation vars @@ -16506,12 +16375,12 @@ NB: You can use dietpi-software at a later date, to install optimized software f fi # - Disable serial? - # must be enabled for the following: + # Must be enabled for the following: # XU4: https://github.com/MichaIng/DietPi/issues/2038#issuecomment-416089875 # RockPro64: Fails to boot into kernel without serial enabled # NanoPi Neo Air: Required for end users/debugging/setting up WiFi without automation - if (( $(grep -m1 '^[[:blank:]]*CONFIG_SERIAL_CONSOLE_ENABLE=' /DietPi/dietpi.txt | sed 's/^.*=//') == 1 && - $G_HW_MODEL != 11 && $G_HW_MODEL != 42 && $G_HW_MODEL != 64 )); then + if grep -q '^[[:blank:]]*CONFIG_SERIAL_CONSOLE_ENABLE=1' /DietPi/dietpi.txt && + (( $G_HW_MODEL != 11 && $G_HW_MODEL != 42 && $G_HW_MODEL != 64 )); then if G_WHIP_YESNO 'Serial console is currently enabled, would you like to disable it?\n - Disabling serial console will reduce memory consumption slightly\n - If you are unsure on what serial console is, it is safe to disable it'; then @@ -16569,9 +16438,9 @@ NB: You can use dietpi-software at a later date, to install optimized software f # Unmask systemd-logind if set in dietpi.txt / libpam-systemd was installed / Kodi if [[ $(readlink /etc/systemd/system/systemd-logind.service) == '/dev/null' ]] && - ( grep -q '^[[:blank:]]*AUTO_UNMASK_LOGIND=1' /DietPi/dietpi.txt || + { grep -q '^[[:blank:]]*AUTO_UNMASK_LOGIND=1' /DietPi/dietpi.txt || dpkg-query -s 'libpam-systemd' &> /dev/null || - (( ${aSOFTWARE_INSTALL_STATE[31]} > 0 )) ); then + (( ${aSOFTWARE_INSTALL_STATE[31]} > 0 )); }; then G_RUN_CMD systemctl unmask systemd-logind # systemd-logind is currently a static unit, but to be failsafe: @@ -16581,14 +16450,15 @@ NB: You can use dietpi-software at a later date, to install optimized software f fi # Upload DietPi-Survey Data, if opted in, prompt user choice, if no settings file exists - /DietPi/dietpi/dietpi-survey 1 + # - Skip, if G_SERVICE_CONTROL == 0, which is exported by patch_file (DietPi-Update) which sends survey already + [[ $G_SERVICE_CONTROL == 0 ]] || /DietPi/dietpi/dietpi-survey 1 G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" 'Installation completed' if (( $DISABLE_REBOOT )); then # - Start services (restart to reload webserver configs) - /DietPi/dietpi/dietpi-services restart + [[ $G_SERVICE_CONTROL == 0 ]] || /DietPi/dietpi/dietpi-services restart else diff --git a/dietpi/func/change_hostname b/dietpi/func/change_hostname index 845113f068..571a168d7b 100644 --- a/dietpi/func/change_hostname +++ b/dietpi/func/change_hostname @@ -18,22 +18,22 @@ #//////////////////////////////////// #Import DietPi-Globals --------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals + G_PROGRAM_NAME='DietPi-Change_hostname' G_CHECK_ROOT_USER G_CHECK_ROOTFS_RW - G_PROGRAM_NAME='DietPi-Change_hostname' G_INIT #Import DietPi-Globals --------------------------------------------------------------- #///////////////////////////////////////////////////////////////////////////////////// #Change Hostname #///////////////////////////////////////////////////////////////////////////////////// - HOSTNAME_NEW="$1" + HOSTNAME_NEW=$1 #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// G_CONFIG_INJECT '127.0.1.1 ' "127.0.1.1 $HOSTNAME_NEW" /etc/hosts - echo "$HOSTNAME_NEW" > /etc/hostname + echo $HOSTNAME_NEW > /etc/hostname #----------------------------------------------------------------------------------- exit diff --git a/dietpi/func/dietpi-banner b/dietpi/func/dietpi-banner index 7f9d86e6ac..9d75fac5b2 100644 --- a/dietpi/func/dietpi-banner +++ b/dietpi/func/dietpi-banner @@ -15,6 +15,7 @@ # Usage: # - dietpi-banner 0 = top section only # - dietpi-banner 1 = top section and credits + clear + # - dietpi-banner 2 = banner customisation menu #//////////////////////////////////// # Import DietPi-Globals -------------------------------------------------------------- @@ -43,10 +44,11 @@ 'Weather (wttr.in)' 'Custom banner entry' 'Display DietPi useful commands?' + 'MOTD' ) # Set defaults - aENABLED=(1 0 1 0 0 1 0 0 0 0 0 1) + aENABLED=(1 0 1 0 0 1 0 0 0 0 0 1 1) COLOUR_RESET='\e[0m' aCOLOUR=( @@ -58,9 +60,12 @@ ) + # Load settings here, to have chosen ${aCOLOUR[0]} applied to below strings + [[ -f $FP_SAVEFILE ]] && . $FP_SAVEFILE + GREEN_LINE=" ${aCOLOUR[0]}─────────────────────────────────────────────────────$COLOUR_RESET" GREEN_BULLET=" ${aCOLOUR[0]}-$COLOUR_RESET" - GREEN_SEPERATOR="${aCOLOUR[0]}:$COLOUR_RESET" + GREEN_SEPARATOR="${aCOLOUR[0]}:$COLOUR_RESET" . /DietPi/dietpi/.version DIETPI_VERSION="$G_DIETPI_VERSION_CORE.$G_DIETPI_VERSION_SUB.$G_DIETPI_VERSION_RC" @@ -80,8 +85,6 @@ } - Load(){ [[ -f $FP_SAVEFILE ]] && . $FP_SAVEFILE; } - Save(){ > $FP_SAVEFILE @@ -129,11 +132,17 @@ fi echo -e "$GREEN_LINE - ${aCOLOUR[1]}DietPi v$DIETPI_VERSION$COLOUR_RESET $GREEN_SEPERATOR $text_update_available_date$COLOUR_RESET + ${aCOLOUR[1]}DietPi v$DIETPI_VERSION$COLOUR_RESET $GREEN_SEPARATOR $text_update_available_date$COLOUR_RESET $GREEN_LINE" } + Print_Local_Ip(){ + + echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[5]} $GREEN_SEPARATOR $(mawk 'NR==3 {dev=$0} NR==4 {print $0" ("dev")"}' /DietPi/dietpi/.network 2>&1)" #5: LAN IP (adapter) + + } + Print_Credits(){ echo -e " ${aCOLOUR[2]}DietPi Team : MichaIng (lead), Daniel Knight (founder)" @@ -152,13 +161,13 @@ $GREEN_LINE" # Update available? if (( $UPDATE_AVAILABLE )); then - if [[ $UPDATE_AVAILABLE_VERSION = '-1' ]]; then + if [[ $UPDATE_AVAILABLE_VERSION == '-1' ]]; then echo -e " ${aCOLOUR[3]}Updated DietPi image is available, please download it:$COLOUR_RESET\n https://dietpi.com/#download\n" else - echo -e " ${aCOLOUR[1]}dietpi-update$COLOUR_RESET $GREEN_SEPERATOR ${aCOLOUR[3]}Run now to update DietPi from v$DIETPI_VERSION to v$UPDATE_AVAILABLE_VERSION.$COLOUR_RESET\n" + echo -e " ${aCOLOUR[1]}dietpi-update$COLOUR_RESET $GREEN_SEPARATOR ${aCOLOUR[3]}Run now to update DietPi from v$DIETPI_VERSION to v$UPDATE_AVAILABLE_VERSION.$COLOUR_RESET\n" fi @@ -168,36 +177,48 @@ $GREEN_LINE" Print_Useful_Commands(){ - echo -e "${aCOLOUR[1]} dietpi-launcher$COLOUR_RESET $GREEN_SEPERATOR All the DietPi programs in one place. - ${aCOLOUR[1]}dietpi-config$COLOUR_RESET $GREEN_SEPERATOR Feature rich configuration tool for your device. - ${aCOLOUR[1]}dietpi-software$COLOUR_RESET $GREEN_SEPERATOR Select optimized software for installation. - ${aCOLOUR[1]}htop$COLOUR_RESET $GREEN_SEPERATOR Resource monitor. - ${aCOLOUR[1]}cpu$COLOUR_RESET $GREEN_SEPERATOR Shows CPU information and stats.\n" + echo -e "${aCOLOUR[1]} dietpi-launcher$COLOUR_RESET $GREEN_SEPARATOR All the DietPi programs in one place. + ${aCOLOUR[1]}dietpi-config$COLOUR_RESET $GREEN_SEPARATOR Feature rich configuration tool for your device. + ${aCOLOUR[1]}dietpi-software$COLOUR_RESET $GREEN_SEPARATOR Select optimized software for installation. + ${aCOLOUR[1]}htop$COLOUR_RESET $GREEN_SEPARATOR Resource monitor. + ${aCOLOUR[1]}cpu$COLOUR_RESET $GREEN_SEPARATOR Shows CPU information and stats.\n" } Print_Banner(){ - # - Source DietPi-Globals if CPU temp chosen - [[ ${aENABLED[2]} != 1 || $G_PROGRAM_NAME ]] || . /DietPi/dietpi/func/dietpi-globals + # - Source DietPi-Globals if not yet sourced from main menu and CPU temp chosen + [[ ${aENABLED[2]} != 1 && ${aENABLED[12]} != 1 || $G_PROGRAM_NAME ]] || . /DietPi/dietpi/func/dietpi-globals # - Re-obtain network details if missing and LAN IP chosen - [[ ${aENABLED[5]} != 1 || -f /DietPi/dietpi/.network ]] || /DietPi/dietpi/func/obtain_network_details + [[ ${aENABLED[5]} != 1 || -f '/DietPi/dietpi/.network' ]] || /DietPi/dietpi/func/obtain_network_details printf '\ec' # clear current terminal screen Print_Header - (( ${aENABLED[0]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[0]} $GREEN_SEPERATOR $(mawk 'NR==2 {print $0}' /DietPi/dietpi/.hw_model 2>&1)" #0: Device model - (( ${aENABLED[1]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[1]} $GREEN_SEPERATOR $(uptime -p 2>&1)" #1: Uptime - (( ${aENABLED[2]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[2]} $GREEN_SEPERATOR $(print_full_info=1 G_OBTAIN_CPU_TEMP 2>&1)" #2: CPU temp - (( ${aENABLED[3]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[3]} $GREEN_SEPERATOR $(hostname -f 2>&1)" #3: Hostname - (( ${aENABLED[4]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[4]} $GREEN_SEPERATOR $(hostname -y 2>&1)" #4: Domain name - (( ${aENABLED[5]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[5]} $GREEN_SEPERATOR $(mawk 'NR==3 {dev=$0} NR==4 {print $0" ("dev")"}' /DietPi/dietpi/.network 2>&1)" #5: LAN IP (adapter) - (( ${aENABLED[6]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[6]} $GREEN_SEPERATOR $(curl -sLm 2 https://dietpi.com/myip.php 2>&1)" #6: WAN IP # Move this to /DietPi/dietpi/.network? - (( ${aENABLED[7]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[7]} $GREEN_SEPERATOR $(df -h --output=avail / | mawk 'NR==2 {print $1}' 2>&1)" #7: Freespace (RootFS) - (( ${aENABLED[8]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[8]} $GREEN_SEPERATOR $(df -h --output=avail /mnt/dietpi_userdata | mawk 'NR==2 {print $1}' 2>&1)" #8: Freespace (DietPi userdata) - (( ${aENABLED[9]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[9]} $GREEN_SEPERATOR $(curl -sLm 2 https://wttr.in/?format=4 2>&1)" #9: Weather - (( ${aENABLED[10]} == 1 )) && [[ -x $FP_CUSTOM ]] && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[10]} $GREEN_SEPERATOR $(bash $FP_CUSTOM 2>&1)" #10: Custom + (( ${aENABLED[0]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[0]} $GREEN_SEPARATOR $(mawk 'NR==2 {print $0}' /DietPi/dietpi/.hw_model 2>&1)" #0: Device model + (( ${aENABLED[1]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[1]} $GREEN_SEPARATOR $(uptime -p 2>&1)" #1: Uptime + (( ${aENABLED[2]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[2]} $GREEN_SEPARATOR $(print_full_info=1 G_OBTAIN_CPU_TEMP 2>&1)" #2: CPU temp + (( ${aENABLED[3]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[3]} $GREEN_SEPARATOR $(hostname -f 2>&1)" #3: Hostname + (( ${aENABLED[4]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[4]} $GREEN_SEPARATOR $(hostname -y 2>&1)" #4: Domain name + (( ${aENABLED[5]} == 1 )) && Print_Local_Ip + (( ${aENABLED[6]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[6]} $GREEN_SEPARATOR $(curl -sLm 2 https://dietpi.com/myip.php 2>&1)" #6: WAN IP # Move this to /DietPi/dietpi/.network? + (( ${aENABLED[7]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[7]} $GREEN_SEPARATOR $(df -h --output=avail / | mawk 'NR==2 {print $1}' 2>&1)" #7: Freespace (RootFS) + (( ${aENABLED[8]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[8]} $GREEN_SEPARATOR $(df -h --output=avail /mnt/dietpi_userdata | mawk 'NR==2 {print $1}' 2>&1)" #8: Freespace (DietPi userdata) + (( ${aENABLED[9]} == 1 )) && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[9]} $GREEN_SEPARATOR $(curl -sLm 2 https://wttr.in/?format=4 2>&1)" #9: Weather + (( ${aENABLED[10]} == 1 )) && [[ -x $FP_CUSTOM ]] && echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[10]} $GREEN_SEPARATOR $(bash $FP_CUSTOM 2>&1)" #10: Custom + if (( ${aENABLED[12]} == 1 )); then + + local fp_motd='/tmp/.dietpi_motd' + [[ -f $fp_motd ]] || curl -sLm 2 https://dietpi.com/motd > $fp_motd + if [[ -f $fp_motd ]]; then + + . $fp_motd # Creates $motd variable + echo -e "$GREEN_BULLET ${aCOLOUR[1]}${aDESCRIPTION[12]} $GREEN_SEPARATOR $motd" #12: MOTD + + fi + + fi echo -e "$GREEN_LINE\n" Print_Credits @@ -217,12 +238,12 @@ $GREEN_LINE" do local state='off' - (( ${aENABLED[$i]=0} == 1 )) && state='on' + (( ${aENABLED[$i]:=0} == 1 )) && state='on' G_WHIP_CHECKLIST_ARRAY+=($i "${aDESCRIPTION[$i]}" $state) done - if G_WHIP_CHECKLIST "Please select options to enable in $G_PROGRAM_NAME display:"; then + if G_WHIP_CHECKLIST "Please (de)select options via spacebar to be shown in the $G_PROGRAM_NAME:"; then for i in ${!aDESCRIPTION[@]} do @@ -268,12 +289,10 @@ NB: It is executed as bash script, so it needs to be in bash compatible syntax. #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// - #----------------------------------------------------------------------------------- - Load - #----------------------------------------------------------------------------------- if (( $INPUT == 0 )); then Print_Header + Print_Local_Ip elif (( $INPUT == 1 )); then diff --git a/dietpi/func/dietpi-benchmark b/dietpi/func/dietpi-benchmark index 4a1202fe80..cba73f2bd5 100644 --- a/dietpi/func/dietpi-benchmark +++ b/dietpi/func/dietpi-benchmark @@ -72,7 +72,7 @@ # ------------------------- # DietPi-Benchmark # ------------------------- -BENCH_VERSION=1 +BENCH_VERSION=2 BENCH_HW_MODEL=$G_HW_MODEL BENCH_CPU='$BENCH_CPU' BENCH_ROOTFS_WRITE='$BENCH_ROOTFS_WRITE' @@ -194,7 +194,7 @@ NB: A lower 'Total time' is faster" local benchmark_file_name='benchmark.file' local min_benchmark_size=10 local max_benchmark_size=$(( $(G_CHECK_FREESPACE $FP_BENCHFILE) - 100 )) - (( $max_benchmark_size > 1000 )) && max_benchmark_size=1000 + #(( $max_benchmark_size > 10000 )) && max_benchmark_size=10000 [[ $FP_BENCHFILE != *'/' ]] && FP_BENCHFILE+='/' FP_BENCHFILE+=$benchmark_file_name @@ -326,14 +326,15 @@ NB: A lower 'Total time' is faster" CPU_Benchmark #FS/RAM - BENCH_FILESIZE=10 # - RAM FP_BENCHFILE='/tmp' + BENCH_FILESIZE=$(( $(mawk '/MemFree:/ {print $2;exit}' /proc/meminfo) / 1000 / 4 )) #Free mem / 4 Filesystem_Benchmark # - Rootfs FP_BENCHFILE='/' + BENCH_FILESIZE=100 Filesystem_Benchmark SHOW_RESULTS=1 @@ -388,6 +389,10 @@ Compare these results online with other users, using the link below: #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// + #----------------------------------------------------------------------------------- + #Run at highest priority. + renice -n -19 $$ + #----------------------------------------------------------------------------------- #Init vars for sourcing if (( $INPUT == 0 )); then diff --git a/dietpi/func/dietpi-globals b/dietpi/func/dietpi-globals index 5c32b13a1f..1f7a68a6d3 100644 --- a/dietpi/func/dietpi-globals +++ b/dietpi/func/dietpi-globals @@ -37,7 +37,7 @@ #----------------------------------------------------------------------------------- #To be exported by the originating script, after loading globals and before calling G_INIT() # - Used in G_ERROR_ and G_WHIP_ - G_PROGRAM_NAME='' + unset G_PROGRAM_NAME #Debug enable G_DEBUG=${G_DEBUG:-0} @@ -61,8 +61,8 @@ #DietPi Versions/Branch G_DIETPI_VERSION_CORE=${G_DIETPI_VERSION_CORE:-6} - G_DIETPI_VERSION_SUB=${G_DIETPI_VERSION_SUB:-22} - G_DIETPI_VERSION_RC=${G_DIETPI_VERSION_RC:-2} + G_DIETPI_VERSION_SUB=${G_DIETPI_VERSION_SUB:-23} + G_DIETPI_VERSION_RC=${G_DIETPI_VERSION_RC:-0} G_GITBRANCH=${G_GITBRANCH:-master} G_GITOWNER=${G_GITOWNER:-MichaIng} [[ -f '/DietPi/dietpi/.version' && $( /dev/null rm /tmp/dietpi-process.pid &> /dev/null @@ -458,27 +458,24 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then } - # $1 = mode - # - 0 = Exit all linked scripts (kill all) - # - 1 = Kill current script only, excluding the shell. + # $1 = mode + # 1 = Kill current script only, excluding the shell. + # else = Exit all linked scripts (kill all) G_CHECK_ROOT_USER(){ if [[ $G_CHECK_ROOT_USER_VERIFIED != 1 ]]; then if (( $UID )); then - local input=0 - disable_error=1 G_CHECK_VALIDINT "$1" && input=$1 + G_DIETPI-NOTIFY 1 'Root privileges required. Please run the command with "sudo" or "G_SUDO".' - G_DIETPI-NOTIFY 1 'Root privileges required. Please run the command with "G_SUDO", or, "sudo -s".' + if [[ $1 == 1 ]]; then - if (( $input == 0 )); then - - exit 1 + kill -INT $$ - elif (( $input == 1 )); then + else - kill -INT $$ + exit 1 fi @@ -506,7 +503,7 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then else export G_CHECK_ROOTFS_RW_VERIFIED=1 - G_DIETPI-NOTIFY 0 'RootFS R/W access verified.\n' + G_DIETPI-NOTIFY 0 'RootFS R/W access verified.' fi @@ -517,12 +514,13 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then #----------------------------------------------------------------------------------- # Alias defines #----------------------------------------------------------------------------------- - #DietPi scripts, moved from /etc/bash.bashrc - # - Sudo command, that ensures DietPi-Globals with G_* commands are loaded + # DietPi scripts, moved from /etc/bash.bashrc + # - sudo command that ensures DietPi-Globals with G_* commands are loaded G_SUDO(){ sudo -s . /DietPi/dietpi/func/dietpi-globals && $@; } + # - sudo alias that allows running other aliases with "sudo" + alias sudo='sudo ' # https://github.com/MichaIng/DietPi/issues/424 # - DietPi programs - alias sudo='sudo ' # https://github.com/MichaIng/DietPi/issues/424 alias dietpi-process_tool='/DietPi/dietpi/dietpi-process_tool' alias dietpi-letsencrypt='/DietPi/dietpi/dietpi-letsencrypt' alias dietpi-autostart='/DietPi/dietpi/dietpi-autostart' @@ -544,8 +542,18 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then alias dietpi-banner='/DietPi/dietpi/func/dietpi-banner 2' alias cpu='/DietPi/dietpi/dietpi-cpuinfo' + + # - Misc + # Sudo command, that ensures DietPi-Globals with G_* commands are loaded + G_SUDO(){ sudo -s . /DietPi/dietpi/func/dietpi-globals && $@; } + alias sudo='sudo ' # https://github.com/MichaIng/DietPi/issues/424 + + # - 1337 moments ;) alias 1337='echo Indeed, you are =\)' + # - Helpers + #alias dd='dd status=progress ' #needs to be at end... + # - Optional DietPi software aliases/functions [[ -d /var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn ]] && alias dietpi-nordvpn='/DietPi/dietpi/misc/dietpi-nordvpn' [[ -f /opt/retropie/supplementary/emulationstation/emulationstation ]] && alias emulationstation='/opt/retropie/supplementary/emulationstation/emulationstation' @@ -554,6 +562,7 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then [[ -f $G_FP_DIETPI_USERDATA/dxx-rebirth/run.sh ]] && alias dxx-rebirth="$G_FP_DIETPI_USERDATA/dxx-rebirth/run.sh" [[ -f /usr/share/applications/kodi.desktop ]] && alias startkodi='/DietPi/dietpi/misc/start_kodi' [[ -f /etc/systemd/system/dietpi-cloudshell.service ]] && alias dietpi-cloudshell='/DietPi/dietpi/dietpi-cloudshell' + (( $G_DISTRO > 3 )) && [[ -d $G_FP_DIETPI_USERDATA/sonarr || -d $G_FP_DIETPI_USERDATA/radarr || -d $G_FP_DIETPI_USERDATA/lidarr ]] && alias dietpi-arr_to_RAM='/DietPi/dietpi/misc/dietpi-arr_to_RAM' # - occ/ncc need to be global function, as aliases are not accessible from non-interactive scripts: [[ -f /var/www/owncloud/occ ]] && occ(){ sudo -u www-data php /var/www/owncloud/occ "$@"; } [[ -f /var/www/nextcloud/occ ]] && ncc(){ sudo -u www-data php /var/www/nextcloud/occ "$@"; } @@ -589,7 +598,6 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then G_WHIP_DESTROY(){ # - Delete - unset WHIP_MESSAGE unset WHIP_SIZE_X unset WHIP_SIZE_Y unset WHIP_SIZE_Z @@ -825,12 +833,13 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then # - Display a whip message G_WHIP_MSG(){ - WHIP_MESSAGE=$@ + local WHIP_MESSAGE=$@ if (( $G_USER_INPUTS )); then G_WHIP_INIT 0 whiptail --title "$G_PROGRAM_NAME" --msgbox "$WHIP_MESSAGE" --ok-button "$G_WHIP_BUTTON_OK_TEXT" --backtitle "$WHIP_BACKTITLE" $WHIP_SIZE_Y $WHIP_SIZE_X + G_WHIP_DESTROY else @@ -838,20 +847,19 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then fi - G_WHIP_DESTROY - } #G_WHIP_SCROLLBOX "message" # - Display a whip message inside a scrollbox G_WHIP_SCROLLBOX(){ - WHIP_MESSAGE=$@ + local WHIP_MESSAGE=$@ if (( $G_USER_INPUTS )); then G_WHIP_INIT 0 whiptail --title "$G_PROGRAM_NAME" --scrolltext --msgbox "$WHIP_MESSAGE" --ok-button "$G_WHIP_BUTTON_OK_TEXT" --backtitle "$WHIP_BACKTITLE" $WHIP_SIZE_Y $WHIP_SIZE_X + G_WHIP_DESTROY else @@ -859,8 +867,6 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then fi - G_WHIP_DESTROY - } #G_WHIP_YESNO "message" @@ -872,7 +878,7 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then if (( $G_USER_INPUTS )); then - WHIP_MESSAGE=$@ + local WHIP_MESSAGE=$@ G_WHIP_INIT 0 local option_default_no='--defaultno' [[ ${G_WHIP_DEFAULT_ITEM,,} == 'yes' || ${G_WHIP_DEFAULT_ITEM,,} == 'ok' ]] && option_default_no='' @@ -896,14 +902,14 @@ $(ps f -eo pid,user,tty,cmd | grep -i '[d]ietpi')"; then if (( $G_USER_INPUTS )); then - WHIP_MESSAGE=$@ + local WHIP_MESSAGE=$@ G_WHIP_INIT 0 G_WHIP_RETURNED_VALUE=$(whiptail --title "$G_PROGRAM_NAME" --inputbox "$WHIP_MESSAGE" --ok-button "$G_WHIP_BUTTON_OK_TEXT" --cancel-button "$G_WHIP_BUTTON_CANCEL_TEXT" --default-item "$G_WHIP_DEFAULT_ITEM" --backtitle "$WHIP_BACKTITLE" $WHIP_SIZE_Y $WHIP_SIZE_X "$G_WHIP_DEFAULT_ITEM" 3>&1 1>&2 2>&3; echo $? > /tmp/.G_WHIP_INPUTBOX_RESULT) result=$(&1 1>&2 2>&3; echo $? > /tmp/.WHIP_MENU_RESULT) result=$(&1 1>&2 2>&3; echo $? > /tmp/.WHIP_CHECKLIST_RESULT) G_WHIP_RETURNED_VALUE=$(echo -e "$G_WHIP_RETURNED_VALUE" | tr '\n' ' ') @@ -1370,52 +1376,43 @@ $print_logfile_info #URL Connection test # - $@ = URL - # Optional inputs = timeout | retry_max | optional_cmd_inputs (eg: --no-check-certificate) - # Prompts user to configure network if $G_USER_INPUTS=1 + # Optional variables: $optional_cmd_inputs (eg: --no-check-certificate) + # In case of failure and $G_USER_INPUTS=1: Prompts user to configure network G_CHECK_URL(){ local string=$@ - local timeout=${timeout:-5} - local retry_max=${retry_max:-3} - local optional_cmd_inputs=${optional_cmd_inputs:-} + local timeout=$(grep -m1 '^[[:blank:]]*CONFIG_G_CHECK_URL_TIMEOUT=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + local attempts=$(grep -m1 '^[[:blank:]]*CONFIG_G_CHECK_URL_ATTEMPTS=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') + #local optional_cmd_inputs while : do G_ERROR_HANDLER_COMMAND="Connection test: $string" G_ERROR_HANDLER_ONERROR_FPLOGFILE='/tmp/G_CHECK_URL' - G_ERROR_HANDLER_RETRY=1 + G_DIETPI-NOTIFY -2 "Testing connection to $string, please wait..." + local i=0 - for ((i=1; i<=$retry_max; i++)) + for ((i=1; i<=$attempts; i++)) do - G_DIETPI-NOTIFY -2 "($i/$retry_max) Testing connection to $string, please wait..." - - wget --spider $optional_cmd_inputs --timeout=$timeout --tries=1 "$string" &> $G_ERROR_HANDLER_ONERROR_FPLOGFILE + # Since --tries/-t is not applied on "fatal" errors (resolving failed, connection refused, 404), we need to loop ourself to exclude any temporary issue + wget --spider -t 1 -T $timeout $optional_cmd_inputs "$string" &> $G_ERROR_HANDLER_ONERROR_FPLOGFILE G_ERROR_HANDLER_EXITCODE=$? - # Valid - if (( ! $G_ERROR_HANDLER_EXITCODE )); then - - break - - # Retry - else - sleep 2 - G_DIETPI-NOTIFY -2 "Failed connection attempt ($i/$retry_max), retrying..." + # Valid + (( $G_ERROR_HANDLER_EXITCODE )) || break - fi + # Retry + G_DIETPI-NOTIFY -2 "Failed connection attempt to $string ($i/$attempts), retrying..." + sleep 1 done G_ERROR_HANDLER - if (( ! $G_ERROR_HANDLER_EXITCODE )); then - - break - - fi + (( $G_ERROR_HANDLER_EXITCODE )) || break done @@ -2295,6 +2292,7 @@ $print_logfile_info # - $2 Target setting + value, to inject into config file: After bash string expansion (e.g. variables), everything else will be taken literally, thus no further escaping is required. # - $3 Path to config file # - Optional: $4 Line pattern after which the setting will be added instead of end of file with grep extended regular expression support + # - GCI_PASSWORD=1 G_CONFIG_INJECT, password entry, do not print raw output to screen. # - GCI_PRESERVE=1 G_CONFIG_INJECT preserves current setting, if present. # - GCI_BACKUP=1 G_CONFIG_INJECT creates a backup before editing the file, if backup does not yet exist, to: $3.bak # - GCI_NEWLINE=1 G_CONFIG_INJECT explicitly expands newlines \n within $2, which by default are taken literally @@ -2310,6 +2308,7 @@ $print_logfile_info [[ $G_PROGRAM_NAME ]] || local G_PROGRAM_NAME='G_CONFIG_INJECT' local pattern=${1//\//\\\/} + local setting_raw=$2 local setting=${2//\\/\\\\}; setting=${setting//./\\.}; setting=${setting//+/\\+}; setting=${setting//\*/\\\*}; setting=${setting//\?/\\\?}; setting=${setting//[/\\[} setting=${setting//\(/\\\(}; setting=${setting//\{/\\\{}; setting=${setting//^/\\^}; setting=${setting//&/\\&}; setting=${setting//$/\\$}; setting=${setting//|/\\|}; setting=${setting//\//\\\/} [[ $GCI_NEWLINE == 1 ]] && setting=${setting//\\\\n/\\n} @@ -2317,6 +2316,14 @@ $print_logfile_info local after=${4//\//\\\/} local error='' + # Replace password string by asterisks in output string + if [[ $GCI_PASSWORD == 1 ]]; then + + setting_raw=$(sed -E "s/^.*$pattern[[:blank:]]*//" <<< "$setting_raw") + setting_raw="$(sed -E "s/(^.*$pattern[[:blank:]]*).*$/\1/" <<< "$setting_raw")${setting_raw//?/*}" + + fi + syntax_error(){ [[ $after ]] && after="after line \$4\n $after (raw escaped input)\n" @@ -2325,7 +2332,7 @@ $print_logfile_info G_WHIP_MSG "[FAILED] Syntax error $error Couldn't add setting \$2 - $setting (raw escaped input) + $setting (escaped input) into file \$3 $file $after @@ -2348,18 +2355,18 @@ NB: Please verify the existence of the file \$3 $file\n Retry with proper permissions or apply the setting manually: - $(sed -E "c\\$setting" <<< '')" + $setting_raw" elif error=$(grep -Eq "^[[:blank:]]*$pattern" $file 2>&1); then # As an error within the condition leads to result "false", it can be caught only in next "elif"/"else" statement. if [[ $GCI_PRESERVE == 1 ]]; then - G_DIETPI-NOTIFY 0 "Current setting in \e[33m$file\e[0m will be preserved: \e[33m$(grep -Em1 "^[[:blank:]]*$pattern" $file | sed 's|\\|\\\\|g')\e[0m" + G_DIETPI-NOTIFY 0 "Current setting in \e[33m$file\e[0m will be preserved: \e[33m$([[ $GCI_PASSWORD == 1 ]] && echo "${setting_raw//\\/\\\\}" || grep -Em1 "^[[:blank:]]*$pattern" $file | sed 's|\\|\\\\|g')\e[0m" elif error=$(grep -Eq "^[[:blank:]]*$setting([[:space:]]|$)" $file 2>&1); then - G_DIETPI-NOTIFY 0 "Desired setting in \e[33m$file\e[0m was already set: \e[33m$(grep -Em1 "^[[:blank:]]*$pattern" $file | sed 's|\\|\\\\|g')\e[0m" + G_DIETPI-NOTIFY 0 "Desired setting in \e[33m$file\e[0m was already set: \e[33m$([[ $GCI_PASSWORD == 1 ]] && echo "${setting_raw//\\/\\\\}" || grep -Em1 "^[[:blank:]]*$pattern" $file | sed 's|\\|\\\\|g')\e[0m" elif error=$( (( $(grep -Ec "^[[:blank:]]*$pattern" $file 2>&1) > 1 )) 2>&1); then [[ $error ]] && { syntax_error; return 1; } @@ -2374,14 +2381,14 @@ $(grep -En "^[[:blank:]]*$pattern" $file) ____________\n Either the pattern \$1 needs to be more specific or the desired setting can appear multiple times by design and it cannot be predicted which instance to edit. Please retry with more specific parameter \$1 or apply the setting manually: - $(sed -E "c\\$setting" <<< '')" + $setting_raw" else [[ $error ]] && { syntax_error; return 1; } [[ $GCI_BACKUP == 1 && ! -f $file.bak ]] && cp -a $file $file.bak && G_DIETPI-NOTIFY 2 "Config file backup created: \e[33m$file.bak\e[0m" error=$(sed -Ei "0,/^[[:blank:]]*$pattern.*$/s//$setting/" $file 2>&1) || { syntax_error; return 1; } - G_DIETPI-NOTIFY 0 "Setting in \e[33m$file\e[0m adjusted: \e[33m$(sed -E "c\\$setting" <<< '' | sed 's|\\|\\\\|g')\e[0m" + G_DIETPI-NOTIFY 0 "Setting in \e[33m$file\e[0m adjusted: \e[33m${setting_raw//\\/\\\\}\e[0m" fi @@ -2390,7 +2397,7 @@ Please retry with more specific parameter \$1 or apply the setting manually: [[ $GCI_BACKUP == 1 && ! -f $file.bak ]] && cp -a $file $file.bak && G_DIETPI-NOTIFY 2 "Config file backup created: \e[33m$file.bak\e[0m" error=$(sed -Ei "0,/^[[:blank:]#;]*$pattern.*$/s//$setting/" $file 2>&1) || { syntax_error; return 1; } - G_DIETPI-NOTIFY 0 "Comment in \e[33m$file\e[0m converted to setting: \e[33m$(sed -E "c\\$setting" <<< '' | sed 's|\\|\\\\|g')\e[0m" + G_DIETPI-NOTIFY 0 "Comment in \e[33m$file\e[0m converted to setting: \e[33m${setting_raw//\\/\\\\}\e[0m" else [[ $error ]] && { syntax_error; return 1; } @@ -2401,7 +2408,7 @@ Please retry with more specific parameter \$1 or apply the setting manually: [[ $GCI_BACKUP == 1 && ! -f $file.bak ]] && cp -a $file $file.bak && G_DIETPI-NOTIFY 2 "Config file backup created: \e[33m$file.bak\e[0m" error=$(sed -Ei "0,/^[[:blank:]]*$after.*$/s//&\n$setting/" $file 2>&1) || { syntax_error; return 1; } - G_DIETPI-NOTIFY 0 "Added setting \e[33m$(sed -E "c\\$setting" <<< '' | sed 's|\\|\\\\|g')\e[0m to \e[33m$file\e[0m after line \e[33m$(grep -Em1 "^[[:blank:]]*$after" $file | sed 's|\\|\\\\|g')\e[0m" + G_DIETPI-NOTIFY 0 "Added setting \e[33m${setting_raw//\\/\\\\}\e[0m to \e[33m$file\e[0m after line \e[33m$(grep -Em1 "^[[:blank:]]*$after" $file | sed 's|\\|\\\\|g')\e[0m" else [[ $error ]] && { syntax_error; return 1; } @@ -2412,7 +2419,7 @@ The pattern \$4 could not be found in file \$3 $file\n Please retry with valid parameter \$4 or apply the setting manually: - $(sed -E "c\\$setting" <<< '')" + $setting_raw" fi @@ -2422,7 +2429,7 @@ Please retry with valid parameter \$4 or apply the setting manually: # The following sed does not work on empty files: [[ ! -s $file ]] && echo '# Added by DietPi:' >> $file error=$(sed -Ei "\$a\\$setting" $file 2>&1) || { syntax_error; return 1; } - G_DIETPI-NOTIFY 0 "Added setting \e[33m$(sed -E "c\\$setting" <<< '' | sed 's|\\|\\\\|g')\e[0m to end of file \e[33m$file\e[0m" + G_DIETPI-NOTIFY 0 "Added setting \e[33m${setting_raw//\\/\\\\}\e[0m to end of file \e[33m$file\e[0m" fi @@ -2431,9 +2438,9 @@ Please retry with valid parameter \$4 or apply the setting manually: } #----------------------------------------------------------------------------------- - (( $G_DEBUG == 1 )) && G_DIETPI-NOTIFY 2 'DietPi-Globals loaded\n' + [[ $G_DEBUG == 1 ]] && G_DIETPI-NOTIFY 2 'DietPi-Globals loaded' #----------------------------------------------------------------------------------- - #return exit code 0, by triggering null as last command to output + # Return exit code 0, by triggering null as last command to output : #----------------------------------------------------------------------------------- diff --git a/dietpi/func/dietpi-obtain_hw_model b/dietpi/func/dietpi-obtain_hw_model index 22d2e4b5c0..b1ad7c5a24 100644 --- a/dietpi/func/dietpi-obtain_hw_model +++ b/dietpi/func/dietpi-obtain_hw_model @@ -50,6 +50,7 @@ # G_HW_MODEL 22 Generic device (eg: unknown to DietPi) # G_HW_MODEL 21 x86_64 native (PC) # G_HW_MODEL 20 VM x64 (VMware VirtualBox) + # G_HW_MODEL 15 oDroid N2 # G_HW_MODEL 14 oDroid N1 # G_HW_MODEL 13 oDroid U3 # G_HW_MODEL 12 oDroid C2 @@ -87,6 +88,7 @@ # G_HW_CPUID 1 H3 # G_HW_CPUID 2 H5 # G_HW_CPUID 3 RK3399 + # G_HW_CPUID 4 S922X # - Line 10 - Onboard WiFi/BT Index # HW_ONBOARD_WIFI 0 Not set # HW_ONBOARD_WIFI 1 RPi3/ZeroW (BCM43438) @@ -102,35 +104,30 @@ # HW_MANUFACTURER_NAME #//////////////////////////////////// - #----------------------------------------------------------------------------------- - #Set locale for all scripts, prevents incorrect scraping - export LANG=en_GB.UTF-8 - export LC_ALL=en_GB.UTF-8 - #Ensure we are in /tmp dir: https://github.com/MichaIng/DietPi/issues/2050#issuecomment-419901350 - cd /tmp - #----------------------------------------------------------------------------------- - #Import DietPi-Globals --------------------------------------------------------------- - #. /DietPi/dietpi/func/dietpi-globals - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- + #. /DietPi/dietpi/func/dietpi-globals # Not required + #export LC_ALL=en_GB.UTF-8 # No locale dependant output scrape + #cd /tmp # No tmp file creation + # Import DietPi-Globals -------------------------------------------------------------- #///////////////////////////////////////////////////////////////////////////////////// - #Obtain Hardware Model index + # Obtain Hardware Model index #///////////////////////////////////////////////////////////////////////////////////// FP_G_HW_MODEL_INDENTIFIER='/etc/.dietpi_hw_model_identifier' - G_HW_MODEL=0 + G_HW_MODEL=-1 G_HW_MODEL_DESCRIPTION='Unknown Device' G_DISTRO=0 - ROOTFS_DEVICE_PATH=$(df | mawk '/\/$/ {print $1;exit}') + ROOTFS_DEVICE_PATH=$(df --output=source,target | mawk '/\/$/ {print $1;exit}') HW_UUID=0 G_HW_ARCH=0 - G_HW_ARCH_DESCRIPTION='unknown' + G_HW_ARCH_DESCRIPTION=$(uname -m) IMAGE_ADDITIONAL_CREDITS='' G_HW_CPUID=0 HW_ONBOARD_WIFI=0 - # RPi Extras + # RPi extras HW_REVISION_CODE=0 HW_RELEASE_DATE='Unknown' HW_PCB_REVISION_CODE='Unknown' @@ -140,7 +137,7 @@ RPi_BoardInfo(){ #----------------------------------------------------------------------------------- - #Obtain device info by revision number + # Obtain device info by revision number # *" because 10000002 then it indicates that your Raspberry Pi has been over-volted HW_REVISION_CODE=$(mawk '/Revision/ {print $3;exit}' /proc/cpuinfo) @@ -307,7 +304,6 @@ HW_MEMORY_SIZE=1024 HW_MANUFACTURER_NAME='Sony' G_HW_MODEL=3 - HW_ONBOARD_WIFI=1 elif [[ $HW_REVISION_CODE == *'a21041' ]]; then @@ -423,227 +419,234 @@ # NBB: DO NOT REORDER INDEX's. These are now fixed and will never change (due to survey results etc) Obtain_HW_Info(){ - #Systems that use /etc/.dietpi_hw_model_identifier for G_HW_MODEL + # Systems that use /etc/.dietpi_hw_model_identifier for G_HW_MODEL if [[ -f $FP_G_HW_MODEL_INDENTIFIER ]]; then G_HW_MODEL=$(sed -n 1p $FP_G_HW_MODEL_INDENTIFIER) - #Beagle Bone Black + # Beagle Bone Black if (( $G_HW_MODEL == 71 )); then G_HW_MODEL_DESCRIPTION='BBB' - #Sparky SBC + # Sparky SBC elif (( $G_HW_MODEL == 70 )); then G_HW_MODEL_DESCRIPTION='Sparky SBC' - #Firefly RK3399 + # Firefly RK3399 elif (( $G_HW_MODEL == 69 )); then G_HW_MODEL_DESCRIPTION='Firefly RK3399' G_HW_CPUID=3 - #NanoPC T4 + # NanoPC T4 elif (( $G_HW_MODEL == 68 )); then G_HW_MODEL_DESCRIPTION='NanoPC T4' G_HW_CPUID=3 - #NanoPi K1 Plus + # NanoPi K1 Plus elif (( $G_HW_MODEL == 67 )); then G_HW_MODEL_DESCRIPTION='NanoPi K1 Plus' G_HW_CPUID=2 - #NanoPi M1 Plus + # NanoPi M1 Plus elif (( $G_HW_MODEL == 66 )); then G_HW_MODEL_DESCRIPTION='NanoPi M1 Plus' G_HW_CPUID=1 - #NanoPi NEO 2 + # NanoPi NEO 2 elif (( $G_HW_MODEL == 65 )); then G_HW_MODEL_DESCRIPTION='NanoPi NEO 2' G_HW_CPUID=2 - #NanoPi NEO Air + # NanoPi NEO Air elif (( $G_HW_MODEL == 64 )); then G_HW_MODEL_DESCRIPTION='NanoPi NEO Air' G_HW_CPUID=1 - #NanoPi M1 + # NanoPi M1 elif (( $G_HW_MODEL == 63 )); then G_HW_MODEL_DESCRIPTION='NanoPi M1/T1' G_HW_CPUID=1 - #NanoPi M3 + # NanoPi M3 elif (( $G_HW_MODEL == 62 )); then G_HW_MODEL_DESCRIPTION='NanoPi M3/T3/F3' - #NanoPi M2 + # NanoPi M2 elif (( $G_HW_MODEL == 61 )); then G_HW_MODEL_DESCRIPTION='NanoPi M2/T2' - #NanoPi Neo + # NanoPi Neo elif (( $G_HW_MODEL == 60 )); then G_HW_MODEL_DESCRIPTION='NanoPi Neo' G_HW_CPUID=1 - #BananaPi (1st Gen) + # BananaPi (1st Gen) elif (( $G_HW_MODEL == 53 )); then G_HW_MODEL_DESCRIPTION='BananaPi' - #Asus Tinker Board + # Asus Tinker Board elif (( $G_HW_MODEL == 52 )); then G_HW_MODEL_DESCRIPTION='Asus Tinker Board' - #BananaPi Pro + # BananaPi Pro elif (( $G_HW_MODEL == 51 )); then G_HW_MODEL_DESCRIPTION='BananaPi Pro' - #BananaPi M2+ + # BananaPi M2+ elif (( $G_HW_MODEL == 50 )); then G_HW_MODEL_DESCRIPTION='BananaPi M2+' G_HW_CPUID=1 - #Pinebook A64 + # Pinebook A64 elif (( $G_HW_MODEL == 44 )); then G_HW_MODEL_DESCRIPTION='Pinebook A64' - #Rock64 + # Rock64 elif (( $G_HW_MODEL == 43 )); then G_HW_MODEL_DESCRIPTION='Rock64' - #RockPro64 + # RockPro64 elif (( $G_HW_MODEL == 42 )); then G_HW_MODEL_DESCRIPTION='RockPro64' G_HW_CPUID=3 - #OrangePi PC Plus + # OrangePi PC Plus elif (( $G_HW_MODEL == 41 )); then G_HW_MODEL_DESCRIPTION='OrangePi PC Plus' G_HW_CPUID=1 - #PineA64 + # PineA64 elif (( $G_HW_MODEL == 40 )); then G_HW_MODEL_DESCRIPTION='Pine A64' - #LeMaker Guitar + # LeMaker Guitar elif (( $G_HW_MODEL == 39 )); then G_HW_MODEL_DESCRIPTION='LeMaker Guitar' - #OrangePi PC 2 + # OrangePi PC 2 elif (( $G_HW_MODEL == 38 )); then G_HW_MODEL_DESCRIPTION='OPi PC2' G_HW_CPUID=2 - #OrangePi Prime + # OrangePi Prime elif (( $G_HW_MODEL == 37 )); then G_HW_MODEL_DESCRIPTION='OPi Prime' G_HW_CPUID=2 - #OrangePi Win + # OrangePi Win elif (( $G_HW_MODEL == 36 )); then G_HW_MODEL_DESCRIPTION='OPi Win' - #OrangePi Zero Plus 2 (h3/h5) + # OrangePi Zero Plus 2 (h3/h5) elif (( $G_HW_MODEL == 35 )); then G_HW_MODEL_DESCRIPTION='OPi Zero 2 Plus' G_HW_CPUID=1 - #OrangePi Plus + # OrangePi Plus elif (( $G_HW_MODEL == 34 )); then G_HW_MODEL_DESCRIPTION='OrangePi Plus' G_HW_CPUID=1 - #OrangePi Lite + # OrangePi Lite elif (( $G_HW_MODEL == 33 )); then G_HW_MODEL_DESCRIPTION='OrangePi Lite' G_HW_CPUID=1 - #OrangePi Zero + # OrangePi Zero elif (( $G_HW_MODEL == 32 )); then G_HW_MODEL_DESCRIPTION='OrangePi Zero' - #G_HW_CPUID=1 #H2+ + #G_HW_CPUID=1 # H2+ - #OrangePi One + # OrangePi One elif (( $G_HW_MODEL == 31 )); then G_HW_MODEL_DESCRIPTION='OrangePi One' G_HW_CPUID=1 - #OrangePi Pc + # OrangePi Pc elif (( $G_HW_MODEL == 30 )); then G_HW_MODEL_DESCRIPTION='OrangePi PC' G_HW_CPUID=1 - #Generic device (eg: unknown to DietPi) + # Generic device (eg: unknown to DietPi) elif (( $G_HW_MODEL == 22 )); then G_HW_MODEL_DESCRIPTION='Generic Device' IMAGE_ADDITIONAL_CREDITS='You!' - #x86_64 native PC + # x86_64 native PC elif (( $G_HW_MODEL == 21 )); then G_HW_MODEL_DESCRIPTION='Native PC' - #VM + # VM elif (( $G_HW_MODEL == 20 )); then G_HW_MODEL_DESCRIPTION='Virtual Machine' - #oDroid N1 + # Odroid N2 + elif (( $G_HW_MODEL == 15 )); then + + G_HW_MODEL_DESCRIPTION='Odroid N2' + G_HW_CPUID=4 + #IMAGE_ADDITIONAL_CREDITS='Meveric' + + # Odroid N1 elif (( $G_HW_MODEL == 14 )); then G_HW_MODEL_DESCRIPTION='Odroid N1' G_HW_CPUID=3 #IMAGE_ADDITIONAL_CREDITS='Meveric' - #oDroid U3 + # Odroid U3 elif (( $G_HW_MODEL == 13 )); then G_HW_MODEL_DESCRIPTION='Odroid U3' #IMAGE_ADDITIONAL_CREDITS='Meveric' - #Odroid C2 + # Odroid C2 elif (( $G_HW_MODEL == 12 )); then G_HW_MODEL_DESCRIPTION='Odroid C2' IMAGE_ADDITIONAL_CREDITS='Meveric' - #Odroid XU3/XU4/HC1/HC2 + # Odroid XU3/XU4/HC1/HC2 elif (( $G_HW_MODEL == 11 )); then G_HW_MODEL_DESCRIPTION='Odroid XU3/XU4/HC1/HC2' IMAGE_ADDITIONAL_CREDITS='Meveric' - #Odroid C1 + # Odroid C1 elif (( $G_HW_MODEL == 10 )); then G_HW_MODEL_DESCRIPTION='Odroid C1' @@ -651,7 +654,7 @@ fi - #RPi + # RPi elif grep -qi '^ID=raspbian' /etc/os-release; then #Grab hardware description from rpi_boardinfo @@ -659,7 +662,7 @@ fi - #Get Distro Index + # Get distro index if grep -qi 'jessie' /etc/os-release; then G_DISTRO=3 @@ -674,10 +677,10 @@ fi - #Generate UUID if it does not exist + # Generate UUID if it does not exist if [[ -f '/DietPi/dietpi/.hw_model' ]]; then - HW_UUID=$(sed -n 5p /DietPi/dietpi/.hw_model) + HW_UUID=$(mawk 'NR==5 {print}' /DietPi/dietpi/.hw_model) else @@ -685,8 +688,7 @@ fi - #Obtain hardware cpu architecture - G_HW_ARCH_DESCRIPTION=$(uname -m) + # Obtain hardware CPU architecture if [[ $G_HW_ARCH_DESCRIPTION == 'armv6l' ]]; then G_HW_ARCH=1 @@ -713,7 +715,7 @@ # - Add HW arch to HW desc G_HW_MODEL_DESCRIPTION+=" ($G_HW_ARCH_DESCRIPTION)" - #Save data + # Save data echo "$G_HW_MODEL $G_HW_MODEL_DESCRIPTION $G_DISTRO @@ -726,7 +728,7 @@ $G_HW_CPUID $HW_ONBOARD_WIFI HW_MEMORY_SIZE=$HW_MEMORY_SIZE" > /DietPi/dietpi/.hw_model - # - RPi Extras + # - RPi extras (( $G_HW_MODEL < 10 )) && echo "$HW_REVISION_CODE HW_RELEASE_DATE=$HW_RELEASE_DATE HW_PCB_REVISION_CODE=$HW_PCB_REVISION_CODE diff --git a/dietpi/func/dietpi-set_hardware b/dietpi/func/dietpi-set_hardware index 0509ad6e8f..4579fc003a 100644 --- a/dietpi/func/dietpi-set_hardware +++ b/dietpi/func/dietpi-set_hardware @@ -12,27 +12,27 @@ # Usage: FP_SCRIPT='/DietPi/dietpi/func/dietpi-set_hardware' AVAIABLE_COMMANDS=" -Available commands -$FP_SCRIPT enableipv6 enable/disable -$FP_SCRIPT preferipv4 enable/disable -$FP_SCRIPT eth-forcespeed 10/100/1000/disable -$FP_SCRIPT wifimodules enable/disable/onboard_enable/onboard_disable -$FP_SCRIPT wificountrycode GB/US/DE -$FP_SCRIPT bluetooth enable/disable -$FP_SCRIPT serialconsole enable/disable -$FP_SCRIPT i2c enable/disable/khz -$FP_SCRIPT soundcard target_card (non-matching name for reset to default) add '-eq' to target_card string, enable alsa eq on card. HW:x,x (specify target card and device index eg: HW:9,1) -$FP_SCRIPT remoteir odroid_remote/justboom_ir_remote # Odroid/RPi only -$FP_SCRIPT lcdpanel target_panel (none to remove all) -$FP_SCRIPT gpumemsplit 64/128/256 # RPi only -$FP_SCRIPT headless enable/disable -$FP_SCRIPT rpi-camera enable/disable -$FP_SCRIPT rpi-opengl vc4-kms-v3d/vc4-fkms-v3d/disable -$FP_SCRIPT rpi3_usb_boot enable +Available commands: +$FP_SCRIPT enableipv6 enable/disable +$FP_SCRIPT preferipv4 enable/disable +$FP_SCRIPT eth-forcespeed 10/100/1000/disable +$FP_SCRIPT wifimodules enable/disable/onboard_enable/onboard_disable +$FP_SCRIPT wificountrycode GB/US/DE/... +$FP_SCRIPT bluetooth enable/disable +$FP_SCRIPT serialconsole enable/disable [tty(S|AMA|SAC)[0-9]] (optional Serial/UART device) +$FP_SCRIPT i2c enable/disable/khz +$FP_SCRIPT soundcard target_card (non-matching name for reset to default). Add '-eq' to target_card string to enable ALSA equalizer on card. HW:x,x (specify target card and device index eg: HW:9,1) +$FP_SCRIPT remoteir odroid_remote/justboom_ir_remote # Odroid/RPi only +$FP_SCRIPT lcdpanel target_panel (none to remove all) +$FP_SCRIPT headless enable/disable +$FP_SCRIPT gpumemsplit 64/128/256 # RPi only +$FP_SCRIPT rpi-camera enable/disable +$FP_SCRIPT rpi-opengl vc4-kms-v3d/vc4-fkms-v3d/disable +$FP_SCRIPT rpi3_usb_boot enable " #//////////////////////////////////// - #Grab Inputs + # Grab Inputs INPUT_DEVICE_NAME=${1,,} INPUT_DEVICE_VALUE=${2,,} # - Support for 1/0 inputs for enable/disable @@ -45,21 +45,37 @@ $FP_SCRIPT rpi3_usb_boot enable INPUT_DEVICE_VALUE='disable' fi + INPUT_ADDITIONAL=$3 - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals - G_PROGRAM_NAME='DietPi-Set_Hardware' + G_PROGRAM_NAME='DietPi-Set_hardware' G_CHECK_ROOT_USER G_CHECK_ROOTFS_RW G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- + # Semi non-RAMdisk support if (( $G_HW_MODEL < 10 )); then FP_RPI_CONFIG='/DietPi/config.txt' - #Semi support non-dietpi Raspbian [[ -f $FP_RPI_CONFIG ]] || FP_RPI_CONFIG='/boot/config.txt' + # ARMbian uses armbianEnv.txt instead which requires different syntax + elif [[ -f /boot/armbianEnv.txt ]]; then + + ARMBIAN=1 + FP_UENV='/boot/armbianEnv.txt' + [[ -f /DietPi/armbianEnv.txt ]] && FP_UENV='/DietPi/armbianEnv.txt' + + # Sparky SBC uEnv.txt has been renamed to uenv.txt which is currently not copied to RAMdisk + else + + ARMBIAN=0 + FP_UENV='/tmp/uEnv.txt' + for i in /{DietPi,boot}/u{e,E}nv.txt; do [[ -f $i ]] && FP_UENV=$i && break; done + unset i + fi EXIT_CODE=0 @@ -68,36 +84,34 @@ $FP_SCRIPT rpi3_usb_boot enable Unknown_Input_Name(){ - EXIT_CODE=1 G_DIETPI-NOTIFY 2 "Unknown input name ($INPUT_DEVICE_NAME). Nothing has been applied." echo "$AVAIABLE_COMMANDS" + EXIT_CODE=1 } Unknown_Input_Mode(){ - EXIT_CODE=1 G_DIETPI-NOTIFY 2 "Unknown input value ($INPUT_DEVICE_VALUE). Nothing has been applied." echo "$AVAIABLE_COMMANDS" + EXIT_CODE=1 } Unsupported_Input_Name(){ - EXIT_CODE=0 G_DIETPI-NOTIFY 2 "Input name ($INPUT_DEVICE_NAME) is not supported by $G_HW_MODEL_DESCRIPTION. Nothing has been applied." } Unsupported_Input_Mode(){ - EXIT_CODE=0 G_DIETPI-NOTIFY 2 "Input value ($INPUT_DEVICE_VALUE) is not supported by $G_HW_MODEL_DESCRIPTION. Nothing has been applied." } #///////////////////////////////////////////////////////////////////////////////////// - #rpi-camera + # rpi-camera #///////////////////////////////////////////////////////////////////////////////////// RPi_Camera_Main(){ @@ -121,10 +135,8 @@ $FP_SCRIPT rpi3_usb_boot enable Gpu_Memory_Split_Main INPUT_DEVICE_VALUE=$tmp - unset tmp fi - unset gpu_mem elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then @@ -140,7 +152,7 @@ $FP_SCRIPT rpi3_usb_boot enable } #///////////////////////////////////////////////////////////////////////////////////// - #rpi3_usb_boot + # rpi3_usb_boot #///////////////////////////////////////////////////////////////////////////////////// RPi_USB_Boot_Main(){ @@ -152,26 +164,34 @@ $FP_SCRIPT rpi3_usb_boot enable cat << _EOF_ > /etc/systemd/system/dietpi-rm_program_usb_boot_mode.service [Unit] -Description=dietpi-rm_program_usb_boot_mode.service +Description=DietPi-rm_program_usb_boot_mode.service After=dietpi-boot.service [Service] -Type=simple +Type=oneshot RemainAfterExit=yes ExecStartPre=$(command -v sed) -i '/^[[:blank:]]*program_usb_boot_mode=/d' $FP_RPI_CONFIG ExecStartPre=$(command -v systemctl) disable dietpi-rm_program_usb_boot_mode -ExecStart=$(command -v systemctl) daemon-reload +ExecStart=$(command -v rm) /etc/systemd/system/dietpi-rm_program_usb_boot_mode.service [Install] WantedBy=multi-user.target _EOF_ -systemctl daemon-reload -systemctl enable dietpi-rm_program_usb_boot_mode + systemctl daemon-reload + systemctl enable dietpi-rm_program_usb_boot_mode elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then sed -i '/^[[:blank:]]*program_usb_boot_mode=/d' $FP_RPI_CONFIG + if [[ -f /etc/systemd/system/dietpi-rm_program_usb_boot_mode.service ]]; then + + systemctl disable dietpi-rm_program_usb_boot_mode + rm /etc/systemd/system/dietpi-rm_program_usb_boot_mode.service + systemctl daemon-reload + + fi + else Unknown_Input_Mode @@ -181,22 +201,22 @@ systemctl enable dietpi-rm_program_usb_boot_mode } #///////////////////////////////////////////////////////////////////////////////////// - #gpumemsplit + # gpumemsplit #///////////////////////////////////////////////////////////////////////////////////// Gpu_Memory_Split_Main(){ (( $G_HW_MODEL > 9 )) && { Unsupported_Input_Name; return 1; } # Exit path for non-RPi # Remove overridden "gpu_mem" setting - sed -i '/^[[:blank:]]*gpu_mem=' $FP_RPI_CONFIG + sed -i '/^[[:blank:]]*gpu_mem=/d' $FP_RPI_CONFIG if disable_error=1 G_CHECK_VALIDINT "$INPUT_DEVICE_VALUE" 16 944; then G_CONFIG_INJECT 'gpu_mem_1024=' "gpu_mem_1024=$INPUT_DEVICE_VALUE" $FP_RPI_CONFIG local gpu_mem_cap=$INPUT_DEVICE_VALUE - (( $INPUT_DEVICE_VALUE >= 512 )) && gpu_mem_cap=448 + (( $INPUT_DEVICE_VALUE > 448 )) && gpu_mem_cap=448 G_CONFIG_INJECT 'gpu_mem_512=' "gpu_mem_512=$gpu_mem_cap" $FP_RPI_CONFIG - (( $INPUT_DEVICE_VALUE >= 256 )) && gpu_mem_cap=192 + (( $INPUT_DEVICE_VALUE > 192 )) && gpu_mem_cap=192 G_CONFIG_INJECT 'gpu_mem_256=' "gpu_mem_256=$gpu_mem_cap" $FP_RPI_CONFIG else @@ -208,12 +228,13 @@ systemctl enable dietpi-rm_program_usb_boot_mode } #///////////////////////////////////////////////////////////////////////////////////// - #headless + # headless #///////////////////////////////////////////////////////////////////////////////////// Headless_Main(){ if [[ $INPUT_DEVICE_VALUE == 'enable' ]]; then + # RPi if (( $G_HW_MODEL < 10 )); then # - Framebuffer dimensions should not play a role here, but @@ -223,23 +244,23 @@ systemctl enable dietpi-rm_program_usb_boot_mode G_CONFIG_INJECT 'framebuffer_height=' '#framebuffer_height=0' /DietPi/config.txt G_CONFIG_INJECT 'max_framebuffer_width=' '#max_framebuffer_width=0' /DietPi/config.txt G_CONFIG_INJECT 'max_framebuffer_height=' '#max_framebuffer_height=0' /DietPi/config.txt - # - Splash cannot be seen anyway, without video output + # - Splash cannot be seen anyway without video output G_CONFIG_INJECT 'disable_splash=' 'disable_splash=1' /DietPi/config.txt # - hdmi_blanking should not play a role, however mode 1 should be generally preferred, which on idle disables HDMI output completely instead of just blanking the screen G_CONFIG_INJECT 'hdmi_blanking=' 'hdmi_blanking=1' /DietPi/config.txt - # - Disable HDMI hotplug, which requires it to be generally responsive/active + # - Disable HDMI hotplug detection, which requires it to be generally responsive/active G_CONFIG_INJECT 'hdmi_ignore_hotplug=' 'hdmi_ignore_hotplug=1' /DietPi/config.txt # - Disable composite hotplug, which then allows to completely disable the video pipeline + framebuffer G_CONFIG_INJECT 'hdmi_ignore_composite=' 'hdmi_ignore_composite=1' /DietPi/config.txt - #odroid C1 + # Odroid C1 elif (( $G_HW_MODEL == 10 )); then G_CONFIG_INJECT 'setenv hdmioutput ' 'setenv hdmioutput "0"' /DietPi/boot.ini G_CONFIG_INJECT 'setenv vpu ' 'setenv vpu "0"' /DietPi/boot.ini G_CONFIG_INJECT 'setenv m_bpp ' 'setenv m_bpp "32"' /DietPi/boot.ini - #Odroid C2 + # Odroid C2 elif (( $G_HW_MODEL == 12 )); then G_CONFIG_INJECT 'setenv nographics ' 'setenv nographics "1"' /DietPi/boot.ini @@ -252,20 +273,21 @@ systemctl enable dietpi-rm_program_usb_boot_mode elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then + # RPi if (( $G_HW_MODEL < 10 )); then G_CONFIG_INJECT 'hdmi_ignore_hotplug=' '#hdmi_ignore_hotplug=0' /DietPi/config.txt G_CONFIG_INJECT 'hdmi_ignore_composite=' '#hdmi_ignore_composite=0' /DietPi/config.txt G_CONFIG_INJECT 'hdmi_blanking=' '#hdmi_blanking=0' /DietPi/config.txt - #odroid C1 + # Odroid C1 elif (( $G_HW_MODEL == 10 )); then G_CONFIG_INJECT 'setenv hdmioutput ' 'setenv hdmioutput "1"' /DietPi/boot.ini G_CONFIG_INJECT 'setenv vpu ' 'setenv vpu "1"' /DietPi/boot.ini G_CONFIG_INJECT 'setenv m_bpp ' 'setenv m_bpp "32"' /DietPi/boot.ini - #Odroid C2 + # Odroid C2 elif (( $G_HW_MODEL == 12 )); then G_CONFIG_INJECT 'setenv nographics ' 'setenv nographics "0"' /DietPi/boot.ini @@ -285,32 +307,34 @@ systemctl enable dietpi-rm_program_usb_boot_mode } #///////////////////////////////////////////////////////////////////////////////////// - #remoteir + # remoteir #///////////////////////////////////////////////////////////////////////////////////// RemoteIR_Prereqs(){ G_AG_CHECK_INSTALL_PREREQ lirc; } RemoteIR_Reset_All(){ - # - Disable JustBoom + # Disable JustBoom if (( $G_HW_MODEL < 10 )); then if [[ -f /etc/systemd/system/justboom-ir-mpd.service ]]; then - systemctl stop justboom-ir-mpd.service - systemctl disable justboom-ir-mpd.service + systemctl stop justboom-ir-mpd + systemctl disable justboom-ir-mpd rm /etc/systemd/system/justboom-ir-mpd.service + systemctl daemon-reload fi sed -i '/^[[:blank:]]*dtoverlay=lirc-rpi/d' $FP_RPI_CONFIG sed -i '/^[[:blank:]]*dtparam=gpio_in_pin=25/d' $FP_RPI_CONFIG - # - Disable Odroids + # Disable Odroids elif (( $G_HW_MODEL < 20 )) && [[ -f /etc/systemd/system/odroid-remote.service ]]; then systemctl stop odroid-remote systemctl disable odroid-remote rm /etc/systemd/system/odroid-remote.service + systemctl daemon-reload fi @@ -327,20 +351,16 @@ systemctl enable dietpi-rm_program_usb_boot_mode RemoteIR_Prereqs RemoteIR_Reset_All - # - XU4 Cloudshell + # XU4 Cloudshell if (( $G_HW_MODEL == 11 )); then - # - modules + # - Modules local string='options gpioplug_ir_recv gpio_nr=24 active_low=1' G_CONFIG_INJECT "$string" "$string" /etc/modprobe.d/odroid-cloudshell.conf + G_CONFIG_INJECT 'gpio-ir-recv' 'gpio-ir-recv' /etc/modules + G_CONFIG_INJECT 'gpioplug-ir-recv' 'gpioplug-ir-recv' /etc/modules - string='gpio-ir-recv' - G_CONFIG_INJECT "$string" "$string" /etc/modules - - string='gpioplug-ir-recv' - G_CONFIG_INJECT "$string" "$string" /etc/modules - - # - C1/C2 + # C1/C2 elif (( $G_HW_MODEL == 10 || $G_HW_MODEL == 12 )); then # - Module @@ -348,26 +368,41 @@ systemctl enable dietpi-rm_program_usb_boot_mode fi - # - All - # - Systemd - systemctl disable lirc - [[ -f /etc/init.d/lirc ]] && rm /etc/init.d/lirc - cat << _EOF_ > /etc/systemd/system/odroid-remote.service + # All + # - systemd + if (( $G_DISTRO < 4 )); then + + if [[ -f /etc/init.d/lirc ]]; then + + systemctl disable lirc + rm /etc/init.d/lirc + systemctl daemon-reload + + fi + + cat << _EOF_ > /etc/systemd/system/odroid-remote.service [Unit] Description=Odroid Remote C1/C2/XU4 [Service] Type=forking -ExecStartPre=$(command -v mkdir) -p /var/run/lirc +ExecStartPre=$(command -v mkdir) -p /run/lirc ExecStart=$(command -v lircd) --output=/run/lirc/lircd --driver=default --device=/dev/lirc0 --uinput [Install] WantedBy=multi-user.target _EOF_ - systemctl daemon-reload - systemctl enable odroid-remote + systemctl daemon-reload + systemctl enable odroid-remote + + # Since Stretch a systemd service exists + else - # Lircd conf for Odroid Remote + systemctl enable lircd + + fi + + # - Lircd conf for Odroid Remote cat << _EOF_ > /etc/lirc/lircd.conf begin remote @@ -468,7 +503,7 @@ _EOF_ # + MPD control G_AG_CHECK_INSTALL_PREREQ mpc - cat << _EOF_ > ~/.lircrc + cat << _EOF_ > /root/.lircrc begin prog = irexec button = KEY_ENTER @@ -516,16 +551,13 @@ config = mpc repeat off end _EOF_ - # service + # - Service cat << _EOF_ > /etc/systemd/system/justboom-ir-mpd.service [Unit] Description=justboom-ir-mpd (DietPi) -After=sound.target lirc.service +After=sound.target lircd.service lirc.service [Service] -User=$USER -Type=simple - ExecStart=$(command -v irexec) [Install] @@ -548,7 +580,7 @@ _EOF_ } #///////////////////////////////////////////////////////////////////////////////////// - #Ethernet force link speed + # Ethernet force link speed #///////////////////////////////////////////////////////////////////////////////////// Eth_Force_Speed_Main(){ @@ -574,10 +606,16 @@ _EOF_ systemctl enable ethtool_force_speed systemctl start ethtool_force_speed - elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then # 0 is converted to 'disabled' + elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then # 0 is converted to 'disable' - [[ -f /etc/systemd/system/ethtool_force_speed.service ]] && rm /etc/systemd/system/ethtool_force_speed.service - systemctl daemon-reload + if [[ -f /etc/systemd/system/ethtool_force_speed.service ]]; then + + systemctl stop ethtool_force_speed + systemctl disable ethtool_force_speed + rm /etc/systemd/system/ethtool_force_speed.service + systemctl daemon-reload + + fi else @@ -588,13 +626,13 @@ _EOF_ } #///////////////////////////////////////////////////////////////////////////////////// - #RPi openGL + # RPi openGL #///////////////////////////////////////////////////////////////////////////////////// RPi_OpenGL_Main(){ (( $G_HW_MODEL > 9 )) && { Unsupported_Input_Name; return 1; } # Exit path for non-RPi - #Always remove previous vc4 overlay entry + # Always remove previous vc4 overlay entry sed -i '/^[[:blank:]]*dtoverlay=vc4-/d' $FP_RPI_CONFIG if [[ $INPUT_DEVICE_VALUE == 'vc4-'* ]]; then @@ -606,7 +644,7 @@ _EOF_ echo "dtoverlay=$INPUT_DEVICE_VALUE" >> $FP_RPI_CONFIG - # - set 1080p by default + # - Set 1080p by default G_CONFIG_INJECT 'framebuffer_width=' 'framebuffer_width=1920' $FP_RPI_CONFIG G_CONFIG_INJECT 'framebuffer_height=' 'framebuffer_height=1080' $FP_RPI_CONFIG @@ -641,7 +679,7 @@ _EOF_ Lcd_Panel_ESP01215E_Enable - #disable all + # Disable all elif [[ $INPUT_DEVICE_VALUE == 'none' ]]; then Lcd_Panel_Waveshare32_Disable @@ -656,7 +694,7 @@ _EOF_ fi - #Update dietpi.txt entry? + # Update dietpi.txt entry? (( $update_dietpitxt )) && G_CONFIG_INJECT 'CONFIG_LCDPANEL=' "CONFIG_LCDPANEL=$INPUT_DEVICE_VALUE" /DietPi/dietpi.txt } @@ -687,36 +725,35 @@ _EOF_ Lcd_Panel_Xorg_All_Enable(){ - #Xinput calibrator, fbset for con2fbmap + # Xinput calibrator, fbset for con2fbmap G_AG_CHECK_INSTALL_PREREQ fbset xinput-calibrator xserver-xorg-input-evdev mkdir -p /etc/X11/xorg.conf.d - # - Create desktop icon for xcalibration - # NB: libinput replaces this in start menu + # Create desktop icon for xcalibration + # - NB: libinput replaces this in start menu } - # - Waveshare32 + # Waveshare32 Lcd_Panel_Waveshare32_Enable_X11(){ cat << _EOF_ > /etc/X11/xorg.conf.d/99-waveshare32_xorg.conf Section "Device" - Identifier "Allwinner A10/A13 FBDEV" - Driver "fbdev" - Option "fbdev" "/dev/fb1" - - Option "SwapbuffersWait" "true" + Identifier "Allwinner A10/A13 FBDEV" + Driver "fbdev" + Option "fbdev" "/dev/fb1" + Option "SwapbuffersWait" "true" EndSection _EOF_ cat << _EOF_ > /etc/X11/xorg.conf.d/99-waveshare32_calibration.conf Section "InputClass" -Identifier "calibration" -MatchProduct "ADS7846 Touchscreen" -Option "Calibration" "219 3835 3984 219" -Option "SwapAxes" "1" -Driver "evdev" + Identifier "calibration" + MatchProduct "ADS7846 Touchscreen" + Option "Calibration" "219 3835 3984 219" + Option "SwapAxes" "1" + Driver "evdev" EndSection _EOF_ @@ -726,10 +763,10 @@ _EOF_ (( $G_HW_MODEL > 19 )) && { Unsupported_Input_Mode; return 1; } # Exit path for non-RPi/non-Odroid - #Disable 1st to reset any existing installations: + # Disable 1st to reset any existing installations: Lcd_Panel_Waveshare32_Disable - #RPi + # RPi if (( $G_HW_MODEL < 10 )); then # + X11 @@ -753,30 +790,29 @@ _EOF_ G_CONFIG_INJECT 'dtoverlay=waveshare32b' 'dtoverlay=waveshare32b:rotate=270' $FP_RPI_CONFIG # - Swap input axis - sed -i '/"SwapAxes"/c\ Option "SwapAxes" "1"' /etc/X11/xorg.conf.d/99-waveshare32_calibration.conf + sed -i '/"SwapAxes"/c\ Option "SwapAxes" "1"' /etc/X11/xorg.conf.d/99-waveshare32_calibration.conf # - Move fb0 xorg.conf out the way: https://github.com/MichaIng/DietPi/issues/767 - mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf /usr/share/X11/99-fbturbo.conf + [[ -f /usr/share/X11/xorg.conf.d/99-fbturbo.conf ]] && mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf /usr/share/X11/99-fbturbo.conf - #Odroids + # Odroids else # + X11 Lcd_Panel_Xorg_All_Enable Lcd_Panel_Waveshare32_Enable_X11 - #con2fbmap, maps console (1) to panel(2). Run during boot. + # - con2fbmap, maps console (1) to panel(2). Run during boot. cat << _EOF_ > /etc/systemd/system/con2fbmap.service [Unit] Description=con2fbmap [Service] Type=oneshot +RemainAfterExit=yes ExecStart=$(command -v con2fbmap) 1 2 ExecStop=$(command -v con2fbmap) 1 0 -RemainAfterExit=yes - [Install] WantedBy=multi-user.target _EOF_ @@ -786,35 +822,30 @@ _EOF_ G_CONFIG_INJECT 'spicc' 'spicc' /etc/modules G_CONFIG_INJECT 'fbtft_device' 'fbtft_device' /etc/modules - cat << _EOF_ > /etc/modprobe.d/waveshare32.conf -options fbtft_device name=odroidc_tft32 rotate=270 gpios=reset:116,dc:115 speed=32000000 cs=0 -_EOF_ + echo 'options fbtft_device name=odroidc_tft32 rotate=270 gpios=reset:116,dc:115 speed=32000000 cs=0' > /etc/modprobe.d/waveshare32.conf - #x11 + # - X11 cat << _EOF_ > /etc/X11/xorg.conf.d/99-waveshare32_xorg.conf Section "Device" - Identifier "FBDEV" - Driver "fbdev" - Option "fbdev" "/dev/fb2" - - #Option "SwapbuffersWait" "true" + Identifier "FBDEV" + Driver "fbdev" + Option "fbdev" "/dev/fb2" + #Option "SwapbuffersWait" "true" EndSection - _EOF_ fi - } Lcd_Panel_Waveshare32_Disable(){ - #all + # All [[ -f /etc/X11/xorg.conf.d/99-waveshare32_calibration.conf ]] && rm /etc/X11/xorg.conf.d/99-waveshare32_calibration.conf [[ -f /etc/X11/xorg.conf.d/99-waveshare32_xorg.conf ]] && rm /etc/X11/xorg.conf.d/99-waveshare32_xorg.conf [[ -f /usr/share/applications/xinput_calibrator.desktop ]] && rm /usr/share/applications/xinput_calibrator.desktop - #RPi + # RPi if (( $G_HW_MODEL < 10 )); then [[ -f /boot/overlays/waveshare32b.dtbo ]] && rm /boot/overlays/waveshare32b.dtbo @@ -825,19 +856,24 @@ _EOF_ sed -i '/^[[:blank:]]*dtoverlay=ads7846,cs=1,penirq=17/d' $FP_RPI_CONFIG sed -i '/^[[:blank:]]*dtoverlay=w1-gpio-pullup,gpiopin=4,extpullup=1/d' $FP_RPI_CONFIG - # - Leave these enabled, just incase the user has other hardware that may use them. + # - Leave these enabled, just in case the user has other hardware that may use them. #sed -i '/^[[:blank:]]*dtparam=i2c_arm=/c\dtparam=i2c_arm=on' $FP_RPI_CONFIG #sed -i '/^[[:blank:]]*dtparam=spi=/c\dtparam=spi=on' $FP_RPI_CONFIG # - Move fb0 xorg.conf back: https://github.com/MichaIng/DietPi/issues/767 - [[ -f /usr/share/X11/99-fbturbo.conf ]] && mv /usr/share/X11/99-fbturbo.conf /usr/share/X11/xorg.conf.d/99-fbturbo.conf + [[ -f /usr/share/X11/99-fbturbo.conf && ! -f /usr/share/X11/xorg.conf.d/99-fbturbo.conf ]] && mv /usr/share/X11/99-fbturbo.conf /usr/share/X11/xorg.conf.d/99-fbturbo.conf - #Odroids - elif (( $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 )); then + # Odroids + elif (( $G_HW_MODEL < 20 )); then - [[ -f /etc/systemd/system/con2fbmap.service ]] && rm /etc/systemd/system/con2fbmap.service - systemctl daemon-reload + if [[ -f /etc/systemd/system/con2fbmap.service ]]; then + systemctl stop con2fbmap + systemctl disable con2fbmap + rm /etc/systemd/system/con2fbmap.service + systemctl daemon-reload + + fi [[ -f /etc/modprobe.d/waveshare32.conf ]] && rm /etc/modprobe.d/waveshare32.conf sed -i '/^[[:blank:]]*spicc/d' /etc/modules sed -i '/^[[:blank:]]*fbtft_device/d' /etc/modules @@ -846,16 +882,14 @@ _EOF_ } - # - Odroid Cloudshell + # Odroid Cloudshell Lcd_Panel_Odroidcloudshell_Enable(){ - cat << _EOF_ > /etc/modprobe.d/odroid-cloudshell.conf -options fbtft_device name=hktft9340 busnum=1 rotate=270 -_EOF_ + echo 'options fbtft_device name=hktft9340 busnum=1 rotate=270' > /etc/modprobe.d/odroid-cloudshell.conf G_CONFIG_INJECT 'spi_s3c64xx' 'spi_s3c64xx' /etc/modules G_CONFIG_INJECT 'fbtft_device' 'fbtft_device' /etc/modules - echo 'fbtft_device' >> /etc/modules #XU4 4.9 workaround: https://github.com/MichaIng/DietPi/issues/926#issuecomment-299480918 + echo 'fbtft_device' >> /etc/modules # XU4 4.9 workaround: https://github.com/MichaIng/DietPi/issues/926#issuecomment-299480918 } @@ -865,19 +899,19 @@ _EOF_ sed -i '/^[[:blank:]]*spi_s3c64xx/d' /etc/modules sed -i '/^[[:blank:]]*fbtft_device/d' /etc/modules - ##Cant run it on the fly, locks up device. + # Cant run it on the fly, locks up device. #root@DietPi-XU4:~# modprobe -rf spi_s3c64xx #root@DietPi-XU4:~# modprobe -rf fbtft_device #Segmentation fault } - # - Odroid LCD 3.5 + # Odroid LCD 3.5 Lcd_Panel_OdroidLCD35_Enable(){ (( $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 )) || { Unsupported_Input_Mode; return 1; } # Exit path for non-Odroid - #Reset to disabled: + # Reset to disabled: Lcd_Panel_OdroidLCD35_Disable Lcd_Panel_Xorg_All_Enable @@ -913,9 +947,7 @@ _EOF_ done - unset amodules - - #Service + # Service # - XU4 if (( $G_HW_MODEL == 11 )); then @@ -969,25 +1001,25 @@ _EOF_ systemctl daemon-reload systemctl enable odroid-lcd35 - #XORG - [[ -f /etc/X11/xorg.conf.d/exynos.conf ]] && rm /etc/X11/xorg.conf.d/exynos.conf #XU4 + # - X.org + [[ -f /etc/X11/xorg.conf.d/exynos.conf ]] && rm /etc/X11/xorg.conf.d/exynos.conf # XU4 mkdir -p /etc/X11/xorg.conf.d cat << _EOF_ > /etc/X11/xorg.conf.d/99-odroid-lcd35.conf Section "Device" - Identifier "C fbdev" - Driver "fbdev" - Option "fbdev" "/dev/fb2" + Identifier "C fbdev" + Driver "fbdev" + Option "fbdev" "/dev/fb2" EndSection _EOF_ # - default calibration cat << _EOF_ > /etc/X11/xorg.conf.d/99-calibration.conf Section "InputClass" - Identifier "calibration" - MatchProduct "SX865X Touchscreen" - Option "Calibration" "3854 155 3880 262" - Option "SwapAxes" "0" + Identifier "calibration" + MatchProduct "SX865X Touchscreen" + Option "Calibration" "3854 155 3880 262" + Option "SwapAxes" "0" EndSection _EOF_ @@ -997,14 +1029,20 @@ _EOF_ [[ -f /etc/X11/xorg.conf.d/99-calibration.conf ]] && rm /etc/X11/xorg.conf.d/99-calibration.conf [[ -f /etc/modprobe.d/odroid-lcd35.conf ]] && rm /etc/modprobe.d/odroid-lcd35.conf - [[ -f /etc/systemd/system/odroid-lcd35.service ]] && rm /etc/systemd/system/odroid-lcd35.service + if [[ -f /etc/systemd/system/odroid-lcd35.service ]]; then + + systemctl stop odroid-lcd35 + systemctl disable odroid-lcd35 + rm /etc/systemd/system/odroid-lcd35.service + systemctl daemon-reload + + fi [[ -f /etc/X11/xorg.conf.d/99-odroid-lcd35.conf ]] && rm /etc/X11/xorg.conf.d/99-odroid-lcd35.conf - systemctl daemon-reload } #///////////////////////////////////////////////////////////////////////////////////// - # i2c + # I2C #///////////////////////////////////////////////////////////////////////////////////// I2c_Main(){ @@ -1012,18 +1050,18 @@ _EOF_ if [[ $INPUT_DEVICE_VALUE == 'enable' ]]; then - #Check/install pre-reqs + # Check/install pre-reqs G_AG_CHECK_INSTALL_PREREQ python-smbus i2c-tools - #Kernel modules + # Kernel modules G_CONFIG_INJECT 'i2c-bcm2708' 'i2c-bcm2708' /etc/modules G_CONFIG_INJECT 'i2c-dev' 'i2c-dev' /etc/modules - #config.txt + # config.txt G_CONFIG_INJECT 'dtparam=i2c_arm=' 'dtparam=i2c_arm=on' $FP_RPI_CONFIG G_CONFIG_INJECT 'dtparam=i2c1=' 'dtparam=i2c1=on' $FP_RPI_CONFIG - #DietPi-Software, set installed + # DietPi-Software, set installed sed -i '/^aSOFTWARE_INSTALL_STATE\[72\]=/c\aSOFTWARE_INSTALL_STATE\[72\]=2' /DietPi/dietpi/.installed elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then @@ -1034,12 +1072,12 @@ _EOF_ G_CONFIG_INJECT 'dtparam=i2c1=' 'dtparam=i2c1=off' $FP_RPI_CONFIG G_CONFIG_INJECT 'i2c_arm_baudrate=' 'i2c_arm_baudrate=100000' $FP_RPI_CONFIG - #Set baudrate (khz) | valid int + # Set baudrate (khz) | valid int elif disable_error=1 G_CHECK_VALIDINT "$INPUT_DEVICE_VALUE" 2 10000000; then G_CONFIG_INJECT 'i2c_arm_baudrate=' "i2c_arm_baudrate=$(( $INPUT_DEVICE_VALUE * 1000 ))" $FP_RPI_CONFIG - #inform user + # inform user INPUT_DEVICE_VALUE+='Khz' else @@ -1051,22 +1089,21 @@ _EOF_ } #///////////////////////////////////////////////////////////////////////////////////// - # bluetooth + # Bluetooth #///////////////////////////////////////////////////////////////////////////////////// Bluetooth_Main(){ - local aBLUETOOTH_MODULES=() + local aBLUETOOTH_MODULES=( - aBLUETOOTH_MODULES=('bluetooth') - aBLUETOOTH_MODULES+=('bnep') + 'bluetooth' + 'bnep' + 'btbcm' # RPi3 Broadcom onboard + 'rfcomm' # BPi Pro/M2+ and others + 'hidp' # BPi Pro/M2+ and others + 'hci_uart' - aBLUETOOTH_MODULES+=('btbcm') # rpi3 broadcom onboard - - aBLUETOOTH_MODULES+=('rfcomm') # BPi pro/m2+ and others - aBLUETOOTH_MODULES+=('hidp') # BPi pro/m2+ and others - - aBLUETOOTH_MODULES+=('hci_uart') + ) [[ -f /etc/modprobe.d/disable_bt.conf ]] && rm /etc/modprobe.d/disable_bt.conf @@ -1080,7 +1117,7 @@ _EOF_ systemctl disable brcm_patchram_plus 2> /dev/null # + RPi 3 (apply to all, as pi-bluetooth package is default installed on all RPi's now) - # + Asus TB + # + ASUS TB elif (( $G_HW_MODEL < 10 || $G_HW_MODEL == 52 )); then systemctl stop hciuart 2> /dev/null @@ -1088,7 +1125,7 @@ _EOF_ fi - #bluetooth last + # Bluetooth last systemctl stop bluetooth 2> /dev/null systemctl disable bluetooth 2> /dev/null @@ -1100,7 +1137,7 @@ _EOF_ done - #Purge packages + # Purge packages if (( $G_DIETPI_INSTALL_STAGE >= 0 )); then G_AGP bluetooth bluez-firmware pi-bluetooth @@ -1111,23 +1148,38 @@ _EOF_ # - Enable elif [[ $INPUT_DEVICE_VALUE == 'enable' ]]; then - # + RPi - # Serial console must be disabled: https://github.com/MichaIng/DietPi/issues/2607#issuecomment-470523194 + # Pre-Reqs if (( $G_HW_MODEL < 10 )); then - INPUT_DEVICE_VALUE='disable' Serial_Main + # - Login console on ttyAMA0 must be disabled: https://github.com/MichaIng/DietPi/issues/2607#issuecomment-470523194 + if systemctl -q is-active serial-getty@ttyAMA0; then - fi + if G_WHIP_YESNO '[WARNING] A serial login console is currently active on ttyAMA0\n +Do you want to continue and disable the serial login console?'; then + + INPUT_DEVICE_VALUE='disable' INPUT_ADDITIONAL='ttyAMA0' Serial_Main + + else + + exit 0 + + fi + + fi + + G_AG_CHECK_INSTALL_PREREQ pi-bluetooth + + else + + G_AG_CHECK_INSTALL_PREREQ bluetooth bluez-firmware - #Pre-Reqs - G_AG_CHECK_INSTALL_PREREQ bluetooth bluez-firmware - (( $G_HW_MODEL < 10 )) && G_AG_CHECK_INSTALL_PREREQ pi-bluetooth + fi - #bluetooth first - for ((i=0; i<${#aBLUETOOTH_MODULES[@]}; i++)) + # Bluetooth first + for i in "${aBLUETOOTH_MODULES[@]}" do - modprobe "${aBLUETOOTH_MODULES[$i]}" 2> /dev/null + modprobe "$i" 2> /dev/null done @@ -1142,7 +1194,7 @@ _EOF_ systemctl enable bluetooth 2> /dev/null G_RUN_CMD systemctl start bluetooth - # + RPi + # + RPi if (( $G_HW_MODEL < 10 )); then systemctl enable hciuart @@ -1156,8 +1208,6 @@ _EOF_ fi - unset aBLUETOOTH_MODULES - } #///////////////////////////////////////////////////////////////////////////////////// @@ -1170,7 +1220,7 @@ _EOF_ G_DIETPI-NOTIFY 1 'IPv6 is not supported or disabled on kernel level. Aborting...' EXIT_CODE=1 - return + return 1 elif [[ $INPUT_DEVICE_VALUE == 'enable' ]]; then @@ -1203,17 +1253,17 @@ _EOF_ else Unknown_Input_Mode - return + return 1 fi # Failsafe: Comment "disable_ipv6" entries in all other sysctl config files local i='' - for i in /etc/sysctl.conf /etc/sysctl.d/* + for i in /etc/sysctl{,.d/*}.conf do [[ ! -f $i || $i == *'dietpi-disable_ipv6.conf' ]] && continue - sed -i 's/^[[:blank:]]*net.ipv6.conf.[^[:blank:]].disable_ipv6[[:blank:]]*=/#&/' $i + sed -i 's/^[[:blank:]]*net.ipv6.conf.[^[:blank:]]*.disable_ipv6[[:blank:]]*=/#&/' $i done @@ -1242,7 +1292,7 @@ _EOF_ else Unknown_Input_Mode - return + return 1 fi @@ -1260,21 +1310,16 @@ _EOF_ Wifi_Modules_Main(){ - local aWIFI_MODULES=() - # - All - aWIFI_MODULES=('cfg80211') + local aWIFI_MODULES=('cfg80211') - #NB: we need to start doing these device specific via $G_HW_MODEL index. This prevents unnecessary modules getting loaded. - # + RPi 3 - aWIFI_MODULES+=('brcmfmac') #onboard WiFi - aWIFI_MODULES+=('brcmutil') #onboard WiFi + # + RPi with onboard WiFi + if (( $G_HW_MODEL < 10 && $HW_ONBOARD_WIFI )); then - # + BPi Pro - aWIFI_MODULES+=('ap6211') #onboard + aWIFI_MODULES+=('brcmfmac' 'brcmutil') # + OrangePi Zero - if (( $G_HW_MODEL == 32 )); then + elif (( $G_HW_MODEL == 32 )); then aWIFI_MODULES+=('xradio_wlan') @@ -1283,28 +1328,43 @@ _EOF_ aWIFI_MODULES+=('8189es') - # + Pine A64 / PB / Asus tinker board (onboard) - elif (( $G_HW_MODEL == 40 || $G_HW_MODEL == 44 || $G_HW_MODEL == 52 )); then + # + Pine A64 / PB / ASUS Tinker Board (onboard) + elif (( $G_HW_MODEL == 40 || $G_HW_MODEL == 44 || $G_HW_MODEL == 52 )); then aWIFI_MODULES+=('8723bs') + # + BPi Pro (onboard) + elif (( $G_HW_MODEL == 51 )); then + + aWIFI_MODULES+=('ap6211') + # + NanoPi NEO Air / Zero 2+ elif (( $G_HW_MODEL == 35 || $G_HW_MODEL == 64 )); then - #4.9 uses brcm, only enable dhd for 3.x - [[ ! -d '/boot/dtb' ]] && aWIFI_MODULES+=('dhd') + # 4.9 uses brcm, only enable dhd for 3.x + if [[ -d '/boot/dtb' ]]; then - fi + aWIFI_MODULES+=('brcmfmac' 'brcmutil') + + else + + aWIFI_MODULES+=('dhd') + + fi # + NanoPi T3 - aWIFI_MODULES+=('bcmdhd') + elif (( $G_HW_MODEL == 62 )); then + + aWIFI_MODULES+=('bcmdhd') + + fi # - Disable if [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then [[ -f /etc/modprobe.d/disable_wifi.conf ]] && rm /etc/modprobe.d/disable_wifi.conf - #cfg80211 last + # cfg80211 last for ((i=$(( ${#aWIFI_MODULES[@]} - 1 )); i>=0; i--)) do @@ -1326,19 +1386,19 @@ _EOF_ # - Disable known powersaving options for specific chipsets echo 'options 8192cu rtw_power_mgnt=0' > /etc/modprobe.d/8192cu.conf echo 'options 8188eu rtw_power_mgnt=0' > /etc/modprobe.d/8188eu.conf - echo 'options 8189es rtw_power_mgnt=0' > /etc/modprobe.d/8189es.conf #OPi Plus - echo 'options 8723bs rtw_power_mgnt=0' > /etc/modprobe.d/8723bs.conf #PineA64 + echo 'options 8189es rtw_power_mgnt=0' > /etc/modprobe.d/8189es.conf # OPi Plus + echo 'options 8723bs rtw_power_mgnt=0' > /etc/modprobe.d/8723bs.conf # Pine A64 echo 'options wlan_8192eu rtw_power_mgnt=0' > /etc/modprobe.d/wlan_8192eu.conf # Sparky/Allo WiFi - #cfg80211 first - for ((i=0; i<${#aWIFI_MODULES[@]}; i++)) + # cfg80211 first + for i in "${aWIFI_MODULES[@]}" do - modprobe "${aWIFI_MODULES[$i]}" 2> /dev/null + modprobe "$i" 2> /dev/null done - # - Delay. Without this, kernel reports wifi device not found with RPi 3 and Pine A64 addon board, when ran straight after this script. + # - Delay. Without this, kernel reports WiFi device not found with RPi 3 and Pine A64 addon board, when ran straight after this script. G_DIETPI-NOTIFY 2 'Please wait, enabling WiFi Modules...' # - Had to up the delay from 3 seconds to 8 seconds on WPA2-Enterprise, otherwise still get device not found error. sleep 8 @@ -1346,26 +1406,26 @@ _EOF_ # + RPi 3+, unlock scan+wifi https://github.com/MichaIng/DietPi/issues/1627 rfkill unblock wifi &> /dev/null - #Update our networking file (refresh active wlan index) + # Update our networking file (refresh active wlan index) /DietPi/dietpi/func/obtain_network_details elif [[ $INPUT_DEVICE_VALUE == 'onboard_enable' ]]; then - (( $HW_ONBOARD_WIFI )) || + (( $HW_ONBOARD_WIFI )) || { Unsupported_Input_Mode; return 1; } - #NB: Requires reboot - #NB: Do not change filenames, -f check used by DietPi-Config to obtain state + # NB: Requires reboot + # NB: Do not change filenames, -f check used by DietPi-Config to obtain state [[ -f /etc/modprobe.d/disable_wifi_rpi3_onboard.conf ]] && rm /etc/modprobe.d/disable_wifi_rpi3_onboard.conf elif [[ $INPUT_DEVICE_VALUE == 'onboard_disable' ]]; then - (( $HW_ONBOARD_WIFI )) || + (( $HW_ONBOARD_WIFI )) || { Unsupported_Input_Mode; return 1; } - #NB: Requires reboot - #NB: Do not change filenames, -f check used by DietPi-Config to obtain state + # NB: Requires reboot + # NB: Do not change filenames, -f check used by DietPi-Config to obtain state - # - RPi 3/ZeroW + # - RPi 3/Zero W echo 'blacklist brcmfmac' > /etc/modprobe.d/disable_wifi_rpi3_onboard.conf echo 'blacklist brcmutil' >> /etc/modprobe.d/disable_wifi_rpi3_onboard.conf @@ -1375,13 +1435,11 @@ _EOF_ fi - unset aWIFI_MODULES - } Wifi_Countrycode_Main(){ - #Use country code from command input. Implies new setting. + # Use country code from command input. Implies new setting. if [[ $INPUT_DEVICE_VALUE ]]; then # - Apply value to DietPi.txt @@ -1406,133 +1464,178 @@ _EOF_ # serialconsole #///////////////////////////////////////////////////////////////////////////////////// - MAX_SERIAL_CONSOLES=2 - Serial_Main(){ #------------------------------------------------------------------------------------- - #Enable + # Enable if [[ $INPUT_DEVICE_VALUE == 'enable' ]]; then - #systemctl enable serial-getty@*.service # Wildcard does not work, we need to specify each possible tty device name - #systemctl enable serial-getty@ttyAMA[0-9].service # Number wildcards do not work, we need to specify each possible tty device number + # Enable for specific Serial/UART device + if [[ $INPUT_ADDITIONAL ]]; then - G_DIETPI-NOTIFY 2 'Enabling known serial-getty services, please wait...' - systemctl unmask serial-getty@tty 2> /dev/null - systemctl enable serial-getty@tty 2> /dev/null - for ((i=0; i<=$MAX_SERIAL_CONSOLES; i++)) - do + # - RPi: Warn if on RPi ttyAMA0 is about to be enabled while Bluetooth is up + if [[ $G_HW_MODEL == [0-9] && $INPUT_ADDITIONAL == 'ttyAMA0' ]] && systemctl -q is-active hciuart; then - # - unmask v6.3+ - systemctl unmask serial-getty@ttyAMA$i 2> /dev/null - systemctl unmask serial-getty@ttySAC$i 2> /dev/null - systemctl unmask serial-getty@ttyS$i 2> /dev/null - #systemctl unmask serial-getty@ttyFIQ$i 2> /dev/null #:https://github.com/MichaIng/DietPi/issues/1829#issuecomment-398302497 + if G_WHIP_YESNO '[WARNING] ttyAMA0 is currently used by Bluetooth\n +Do you want to continue and DISABLE Bluetooth now?'; then + INPUT_DEVICE_VALUE='disable' Bluetooth_Main - # - Enable v6.2- - systemctl enable serial-getty@ttyAMA$i 2> /dev/null - systemctl enable serial-getty@ttySAC$i 2> /dev/null - systemctl enable serial-getty@ttyS$i 2> /dev/null - #systemctl enable serial-getty@ttyFIQ$i 2> /dev/null #:https://github.com/MichaIng/DietPi/issues/1829#issuecomment-398302497 + else - # - Allow root login for known TTY's not in /etc/securetty by default - # NanoPC-T4 - G_CONFIG_INJECT "ttyFIQ$i" "ttyFIQ$i" /etc/securetty + exit 0 - done + fi - #Device Specific: - # - RPi - if (( $G_HW_MODEL < 10 )); then + fi - G_CONFIG_INJECT 'enable_uart=' 'enable_uart=1' /DietPi/config.txt + G_DIETPI-NOTIFY 2 "Enabling serial-getty on: /dev/$INPUT_ADDITIONAL" + G_RUN_CMD systemctl unmask serial-getty@$INPUT_ADDITIONAL + G_RUN_CMD systemctl enable serial-getty@$INPUT_ADDITIONAL + # - Start now if device (already) exists + [[ -e /dev/$INPUT_ADDITIONAL ]] && G_RUN_CMD systemctl start serial-getty@$INPUT_ADDITIONAL - # - Odroid C1 - elif (( $G_HW_MODEL == 10 )); then + # Allow root login on selected TTY if not enabled by default + G_CONFIG_INJECT "$INPUT_ADDITIONAL" "$INPUT_ADDITIONAL" /etc/securetty - sed -i '/^setenv condev/c\setenv condev "console=tty0 console=ttyS0,115200n8"' /DietPi/boot.ini + # Enable boot messages depending on device + # - RPi + if (( $G_HW_MODEL < 10 )); then - # - Odroid XU4 - elif (( $G_HW_MODEL == 11 )); then + grep -q "console=$INPUT_ADDITIONAL" /boot/cmdline.txt || sed -i "/root=/s/$/ console=$INPUT_ADDITIONAL,115200/" /boot/cmdline.txt - if ! grep -qi 'console=ttySAC2,115200n8 ' /DietPi/boot.ini; then + # - Odroid C1/C2 + elif (( $G_HW_MODEL == 10 || $G_HW_MODEL == 12 )); then - sed -i 's/console=tty1 /console=tty1 console=ttySAC2,115200n8 /' /DietPi/boot.ini + local old='' + [[ -f /DietPi/boot.ini ]] && old=$(grep -m1 '^setenv condev "' /DietPi/boot.ini) || return + [[ $old =~ console=$INPUT_ADDITIONAL ]] && return + old=$(cut -d \" -f 2 <<< "$old") + G_CONFIG_INJECT 'setenv condev "' "setenv condev \"$old console=$INPUT_ADDITIONAL,115200n8\"" /DietPi/boot.ini - fi + # - Odroid XU4 + elif (( $G_HW_MODEL == 11 )); then - # - Odroid C2 - elif (( $G_HW_MODEL == 12 )); then + local old='' + [[ -f /DietPi/boot.ini ]] && old=$(grep -m1 '^setenv bootrootfs "' /DietPi/boot.ini) || return + [[ $old =~ console=$INPUT_ADDITIONAL ]] && return + old=$(cut -d \" -f 2 <<< "$old") + G_CONFIG_INJECT 'setenv bootrootfs "' "setenv bootrootfs \"$old console=$INPUT_ADDITIONAL,115200n8\"" /DietPi/boot.ini - sed -i '/^setenv condev/c\setenv condev "console=tty0 console=ttyS0,115200n8"' /DietPi/boot.ini + # - ARMbian: armbianEnv.txt only allows to toggle a fixed serial console depending on device + elif (( $ARMBIAN )); then - # - Pine A64 - elif (( $G_HW_MODEL == 40 )); then + grep -q "console=$INPUT_ADDITIONAL" /boot/boot.cmd || return + if grep -qE 'console=(display|both)' $FP_UENV; then - if ! grep -qi 'console=ttyS0,115200n8 ' /DietPi/uEnv.txt; then + G_CONFIG_INJECT 'console=' 'console=both' $FP_UENV - sed -i 's/console=tty0 /console=tty0 console=ttyS0,115200n8 /' /DietPi/uEnv.txt + else + + G_CONFIG_INJECT 'console=' 'console=serial' $FP_UENV + + fi + + # - Pine A64: On ARMbian ttyS0 boot output is forced and custom console is not possible via armbianEnv.txt + elif (( $G_HW_MODEL == 40 )); then + + [[ ! -f $FP_UENV ]] || grep -q "console=$INPUT_ADDITIONAL" $FP_UENV && return + echo "console=$INPUT_ADDITIONAL,115200n8" >> $FP_UENV + + #elif (( $G_HW_MODEL == 70 )); then + + # grep -q "console=$INPUT_ADDITIONAL" $FP_UENV || sed -i "/bootargs=/s/$/ console=$INPUT_ADDITIONAL,115200n8/" $FP_UENV fi - fi + # Enable for all detected Serial/UART devices + else - # - Update dietpi.txt global var - G_CONFIG_INJECT 'CONFIG_SERIAL_CONSOLE_ENABLE=' 'CONFIG_SERIAL_CONSOLE_ENABLE=1' /DietPi/dietpi.txt + # ttyFIQ[0-9]: https://github.com/MichaIng/DietPi/issues/1829#issuecomment-398302497 + for i in /dev/tty{S,AMA,SAC}[0-9] + do + [[ -e $i ]] || continue + INPUT_ADDITIONAL=${i/\/dev\/} Serial_Main + + done + + # On RPi enable primary UART device + (( $G_HW_MODEL < 10 )) && G_CONFIG_INJECT 'enable_uart=' 'enable_uart=1' $FP_RPI_CONFIG + + # Update dietpi.txt global var + G_CONFIG_INJECT 'CONFIG_SERIAL_CONSOLE_ENABLE=' 'CONFIG_SERIAL_CONSOLE_ENABLE=1' /DietPi/dietpi.txt + + fi #------------------------------------------------------------------------------------- - #Disable + # Disable elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then - #Disable services. Although, this seems to have no effect on the cmdline.txt boot.ini etc serial console entries. They run regardless. But lets do it for consistency. - G_DIETPI-NOTIFY 2 'Disabling known serial-getty services, please wait...' - systemctl disable serial-getty@tty 2> /dev/null - systemctl mask serial-getty@tty 2> /dev/null - for ((i=0; i<=$MAX_SERIAL_CONSOLES; i++)) - do + # Disable for specific Serial/UART device + if [[ $INPUT_ADDITIONAL ]]; then - # Disable first, to remove symlink from /etc/systemd/system/getty.target.wants/ - systemctl disable serial-getty@ttyAMA$i 2> /dev/null - systemctl disable serial-getty@ttySAC$i 2> /dev/null - systemctl disable serial-getty@ttyS$i 2> /dev/null - #systemctl disable serial-getty@ttyFIQ$i 2> /dev/null #:https://github.com/MichaIng/DietPi/issues/1829#issuecomment-398302497 + G_DIETPI-NOTIFY 2 "Disabling serial-getty on: /dev/$INPUT_ADDITIONAL" + systemctl stop serial-getty@$INPUT_ADDITIONAL + systemctl disable serial-getty@$INPUT_ADDITIONAL + # - Place a mask only if device exists + [[ -e /dev/$INPUT_ADDITIONAL ]] && systemctl mask serial-getty@$INPUT_ADDITIONAL - systemctl mask serial-getty@ttyAMA$i 2> /dev/null - systemctl mask serial-getty@ttySAC$i 2> /dev/null - systemctl mask serial-getty@ttyS$i 2> /dev/null - #systemctl mask serial-getty@ttyFIQ$i 2> /dev/null #:https://github.com/MichaIng/DietPi/issues/1829#issuecomment-398302497 + # Disable boot messages depending on device + # - RPi + if (( $G_HW_MODEL < 10 )); then - done + sed -i "s/[[:blank:]]*console=$INPUT_ADDITIONAL[^\"[:blank:]]*//" /boot/cmdline.txt - #Device Specific: - # - RPi - if (( $G_HW_MODEL < 10 )); then + # - Odroid C1/C2/XU4 + elif (( $G_HW_MODEL < 12 )); then - sed -i 's/console=ttyAMA0,115200 //' /boot/cmdline.txt #Replaced by enable_uart= + sed -i "s/[[:blank:]]*console=$INPUT_ADDITIONAL[^\"[:blank:]]*//" /DietPi/boot.ini - G_CONFIG_INJECT 'enable_uart=' 'enable_uart=0' /DietPi/config.txt + elif (( $ARMBIAN )); then - # - Odroid C1/C2 - elif (( $G_HW_MODEL == 10 || $G_HW_MODEL == 12 )); then + grep -q "console=$INPUT_ADDITIONAL" /boot/boot.cmd || return + if grep -qE 'console=(display|both)' $FP_UENV; then - G_CONFIG_INJECT 'setenv condev' 'setenv condev "console=tty0"' /DietPi/boot.ini + G_CONFIG_INJECT 'console=' 'console=display' $FP_UENV - # - Odroid XU4 - elif (( $G_HW_MODEL == 11 )); then + else - sed -i 's/console=ttySAC2,115200n8 //' /DietPi/boot.ini + G_CONFIG_INJECT 'console=' 'console=none' $FP_UENV - # - Pine A64 - elif (( $G_HW_MODEL == 40 )); then + fi - sed -i 's/console=ttyS0,115200n8 //' /DietPi/uEnv.txt + # - Pine A64: On ARMbian ttyS0 boot output is forced and custom console is not possible via armbianEnv.txt + elif (( $G_HW_MODEL == 40 )); then - fi + sed -i "/^[[:blank:]]*console=$INPUT_ADDITIONAL[^\"[:blank:]]*$/d" $FP_UENV # New style: One variable each line + sed -i "s/[[:blank:]]*console=$INPUT_ADDITIONAL[^\"[:blank:]]*//" $FP_UENV # Old style: Multiple variables possible each line + + #elif (( $G_HW_MODEL == 70 )); then + + # sed -i "s/[[:blank:]]*console=$INPUT_ADDITIONAL[^\"[:blank:]]*//" $FP_UENV + + fi + + # Disable for all detected Serial/UART devices + else + + # ttyFIQ[0-9]: https://github.com/MichaIng/DietPi/issues/1829#issuecomment-398302497 + for i in /dev/tty{S,AMA,SAC}[0-9] + do + + [[ -e $i ]] || continue + INPUT_ADDITIONAL=${i/\/dev\/} Serial_Main - # - Update dietpi.txt global var - G_CONFIG_INJECT 'CONFIG_SERIAL_CONSOLE_ENABLE=' 'CONFIG_SERIAL_CONSOLE_ENABLE=0' /DietPi/dietpi.txt + done + + # On RPi disable primary UART device + (( $G_HW_MODEL < 10 )) && G_CONFIG_INJECT 'enable_uart=' 'enable_uart=0' $FP_RPI_CONFIG + + # Update dietpi.txt global var + G_CONFIG_INJECT 'CONFIG_SERIAL_CONSOLE_ENABLE=' 'CONFIG_SERIAL_CONSOLE_ENABLE=0' /DietPi/dietpi.txt + + fi else @@ -1545,32 +1648,28 @@ _EOF_ #///////////////////////////////////////////////////////////////////////////////////// # soundcard #///////////////////////////////////////////////////////////////////////////////////// - #NB: When adding a new dtoverlay soundcard, we must add the dtoverlay name for deletion in Soundcard_Reset_RPi() + # NB: When adding a new dtoverlay soundcard, we must add the dtoverlay name for deletion in Soundcard_Reset_RPi() SOUNDCARD_TARGET_CARD=0 SOUNDCARD_TARGET_DEVICE=0 ALSA_EQ_ENABLED=0 - #Disable all soundcards and revert back to default output if available. + # Disable all soundcards and revert back to default output if available. Soundcard_Reset_All(){ SOUNDCARD_TARGET_CARD=0 SOUNDCARD_TARGET_DEVICE=0 ALSA_EQ_ENABLED=0 - #Remove previous asound.conf + # Remove previous asound.conf [[ -f /etc/asound.conf ]] && rm /etc/asound.conf # - Pre-Reqs for any soundcard G_AG_CHECK_INSTALL_PREREQ alsa-utils # Intel sound firmware - if grep -qi 'vendor_id.*intel' /proc/cpuinfo; then - - G_AG_CHECK_INSTALL_PREREQ firmware-intel-sound + grep -qi 'vendor_id.*intel' /proc/cpuinfo && G_AG_CHECK_INSTALL_PREREQ firmware-intel-sound - fi - - #HW specific + # HW specific # - RPi if (( $G_HW_MODEL < 10 )); then @@ -1640,8 +1739,10 @@ _EOF_ # - Disable forced analogue out if [[ -f /etc/systemd/system/rpi-bcm2835_forced_3.5mm.service ]]; then + systemctl stop rpi-bcm2835_forced_3.5mm systemctl disable rpi-bcm2835_forced_3.5mm rm /etc/systemd/system/rpi-bcm2835_forced_3.5mm.service + systemctl daemon-reload fi @@ -1654,19 +1755,21 @@ _EOF_ [[ -f /var/lib/dietpi/postboot.d/c2_smp.sh ]] && rm /var/lib/dietpi/postboot.d/c2_smp.sh - # - hifi shield plus + # - HiFi shield plus sed -i '/^[[:blank:]]*snd-soc-pcm5102/d' /etc/modules sed -i '/^[[:blank:]]*snd-soc-odroid-dac/d' /etc/modules - # - hifi shield 2 + # - HiFi shield 2 sed -i '/^[[:blank:]]*snd-soc-pcm512x/d' /etc/modules sed -i '/^[[:blank:]]*snd-soc-pcm512x-i2c/d' /etc/modules sed -i '/^[[:blank:]]*snd-soc-odroid-dac2/d' /etc/modules if [[ -f '/etc/systemd/system/odroid-hifishield2.service' ]]; then + systemctl stop odroid-hifishield2 systemctl disable odroid-hifishield2 rm /etc/systemd/system/odroid-hifishield2.service + systemctl daemon-reload fi @@ -1674,23 +1777,22 @@ _EOF_ Soundcard_Reset_H2(){ - #set 3.5mm + # Set 3.5mm amixer set -c 0 'Audio lineout' unmute &> /dev/null } Soundcard_Reset_H3(){ - #set hdmi + # Set HDMI amixer set -c 0 'Audio lineout' mute &> /dev/null - SOUNDCARD_TARGET_CARD=1 } Soundcard_Reset_Asus(){ - #set hdmi + # Set HDMI SOUNDCARD_TARGET_CARD=1 } @@ -1699,21 +1801,21 @@ _EOF_ sed -i '/^[[:blank:]]*snd-soc-allo-piano-dac/d' /etc/modules - # - HDMI + # Set HDMI SOUNDCARD_TARGET_DEVICE=1 amixer -c 0 sset 'audio output mode switch' 'hdmi' # Disable USB 1.1 compat - sed -i 's/aotg.aotg1_speed=1/aotg.aotg1_speed=0/' /DietPi/uEnv.txt + sed -i 's/aotg.aotg1_speed=1/aotg.aotg1_speed=0/' $FP_UENV - # - auto unmute + # Auto unmute [[ -f /var/lib/dietpi/postboot.d/sparky_unmute.sh ]] && rm /var/lib/dietpi/postboot.d/sparky_unmute.sh } Soundcard_Reset_BPi_Pro(){ - #3.5mm: https://github.com/MichaIng/DietPi/issues/732#issuecomment-275915919 + # Set 3.5mm: https://github.com/MichaIng/DietPi/issues/732#issuecomment-275915919 SOUNDCARD_TARGET_CARD=0 amixer sset 'Left Mixer Left DAC' off @@ -1729,10 +1831,10 @@ _EOF_ Soundcard_Main(){ #----------------------------------------------------------------------------- - #Always reset soundcards and revert back to HDMI + # Always reset soundcards and revert back to HDMI Soundcard_Reset_All #----------------------------------------------------------------------------- - #Apply specific asound.confs and additional settings + # Apply specific asound.confs and additional settings # - ALSA EQ enabled? if [[ $INPUT_DEVICE_VALUE == *'-eq' ]]; then @@ -1750,12 +1852,12 @@ _EOF_ # - RPi: Enable DTPARAM audio setting (( $G_HW_MODEL < 10 )) && G_CONFIG_INJECT 'dtparam=audio=' 'dtparam=audio=on' $FP_RPI_CONFIG - #Cards + # Cards case "$INPUT_DEVICE_VALUE" in - #ALL: ---------------------------------------------------------------------- + # ALL: ---------------------------------------------------------------------- - #Specify card + device indexs + # Specify card + device indexs hw:*) echo "$INPUT_DEVICE_VALUE" @@ -1779,7 +1881,7 @@ _EOF_ # USB 1.1 compat mode (Sparky currently) if [[ $INPUT_DEVICE_VALUE == 'usb-dac-1.1' ]]; then - sed -i 's/aotg.aotg1_speed=0/aotg.aotg1_speed=1/' /DietPi/uEnv.txt + sed -i 's/aotg.aotg1_speed=0/aotg.aotg1_speed=1/' $FP_UENV fi @@ -1788,7 +1890,7 @@ _EOF_ for x in \$(amixer controls | grep layback) do - amixer cset "\$x" 100% &> /dev/null + amixer cset "\$x" 100% &> /dev/null done alsactl store &> /dev/null @@ -1798,7 +1900,7 @@ _EOF_ elif (( $G_HW_MODEL == 12 )); then cat << _EOF_ > /var/lib/dietpi/postboot.d/c2_smp.sh -#!/bin/bash +#!/bin/dash echo 4 > /proc/irq/63/smp_affinity echo 8 > /proc/irq/62/smp_affinity _EOF_ @@ -1820,7 +1922,7 @@ _EOF_ ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # rpi-bcm2835 # rpi-bcm2835-ultrahq # rpi-bcm2835-3.5mm @@ -1837,12 +1939,11 @@ _EOF_ [Unit] Description=Forces sound through 3.5mm analogue Before=sound.target -After=dietpi-boot.service dietpi-ramdisk.service dietpi-ramlog.service +After=dietpi-boot.service [Service] Type=simple RemainAfterExit=yes - ExecStart=/usr/bin/amixer -c 0 cset numid=3 1 [Install] @@ -1856,7 +1957,7 @@ _EOF_ ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # hifiberry-dac # hifiberry-dacplus # hifiberry-digi @@ -1869,7 +1970,7 @@ _EOF_ ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # googlevoicehat-soundcard googlevoicehat-soundcard*) @@ -1882,7 +1983,7 @@ _EOF_ ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # JustBoom-dac: DAC HAT, Amp HAT, DAC Zero and Amp Zero # JustBoom-digi: Digi HAT and Digi Zero justboom-*) @@ -1892,7 +1993,7 @@ _EOF_ ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # allo-piano-dac-pcm512x-audio # allo-piano-dac-plus-pcm512x-audio (2.1) allo-piano-dac*) @@ -1913,7 +2014,7 @@ _EOF_ ;; - #Sparky SBC (module) + # Sparky SBC (module) # snd-soc-allo-piano-dac # snd-soc-allo-piano-dac-plus (2.1) snd-soc-allo-piano-dac*) @@ -1936,7 +2037,7 @@ _EOF_ ;; - #Sparky SBC + # Sparky SBC # allo-cheapo-analogue #3.5mm/RCA # allo-cheapo-optical #Optical out allo-cheapo*) @@ -1960,7 +2061,7 @@ _EOF_ ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # allo-boss-dac-pcm512x-audio # allo-digione # allo-katana-dac-audio @@ -1980,7 +2081,7 @@ _EOF_ ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # rpi-dac rpi-dac) @@ -1989,7 +2090,7 @@ _EOF_ ;; - #AudioPhonics I-Sabre-K2M (dtoverlay) + # AudioPhonics I-Sabre-K2M (dtoverlay) # i-sabre-k2m i-sabre-k2m) @@ -2047,7 +2148,7 @@ NB: The module must be rebuilt each time the kernel is upgraded. For this, simpl ;; - #RPi (dtoverlay) + # RPi (dtoverlay) # applepi-dac applepi*) @@ -2063,8 +2164,8 @@ NB: The module must be rebuilt each time the kernel is upgraded. For this, simpl ;; - #dionaudio-loco - #dionaudio-loco-v2 + # dionaudio-loco + # dionaudio-loco-v2 dionaudio-loco*) # - enable dtoverlay @@ -2072,7 +2173,7 @@ NB: The module must be rebuilt each time the kernel is upgraded. For this, simpl ;; - #Odroid ------------------------------------------------------------------------------- + # Odroid ------------------------------------------------------------------------------- odroid-hifishield-plus) G_CONFIG_INJECT 'snd-soc-pcm5102' 'snd-soc-pcm5102' /etc/modules @@ -2099,8 +2200,7 @@ After=local-fs.target [Service] Type=oneshot RemainAfterExit=yes - -ExecStart=/bin/bash -c 'echo pcm5242 0x4c > /sys/class/i2c-adapter/i2c-1/new_device' +ExecStart=/bin/dash -c 'echo pcm5242 0x4c > /sys/class/i2c-adapter/i2c-1/new_device' ExecStart=$(command -v amixer) -c 1 sset Analogue 0 ExecStart=$(command -v amixer) -c 1 sset Digital 201 ExecStart=$(command -v amixer) -c 1 sset Deemphasis on @@ -2113,7 +2213,7 @@ _EOF_ ;; - #H2 ------------------------------------------------------------------------------- + # H2 ------------------------------------------------------------------------------- h2-hdmi) amixer set -c 0 'Audio lineout' mute &> /dev/null @@ -2121,7 +2221,7 @@ _EOF_ ;; - #H3 ------------------------------------------------------------------------------- + # H3 ------------------------------------------------------------------------------- h3-analogue) amixer set -c 0 'Audio lineout' unmute &> /dev/null @@ -2129,7 +2229,7 @@ _EOF_ ;; - #Pine A64 ------------------------------------------------------------------------------- + # Pine A64 ------------------------------------------------------------------------------- pine64-analogue) cat << _EOF_ > /etc/modules-load.d/pine64-audiojack.conf @@ -2142,14 +2242,14 @@ _EOF_ ;; - #NanoPi M2/M3 ------------------------------------------------------------------------------- + # NanoPi M2/M3 ------------------------------------------------------------------------------- s5pxx18-hdmi) SOUNDCARD_TARGET_CARD=1 ;; - #Asus tinker ------------------------------------------------------------------------------- + # Asus tinker ------------------------------------------------------------------------------- asus-tb-analogue) SOUNDCARD_TARGET_CARD=0 @@ -2164,32 +2264,32 @@ _EOF_ cat << _EOF_ > /etc/asound.conf pcm.softvol { - type softvol - slave.pcm dmix - control { - name Master - card 0 - } + type softvol + slave.pcm dmix + control { + name Master + card 0 + } } pcm.micboost { - type route - slave.pcm dsnoop - ttable { - 0.0 30.0 - 1.1 30.0 - } + type route + slave.pcm dsnoop + ttable { + 0.0 30.0 + 1.1 30.0 + } } pcm.!default { - type asym - playback.pcm "plug:softvol" - capture.pcm "plug:micboost" + type asym + playback.pcm "plug:softvol" + capture.pcm "plug:micboost" } ctl.!default { - type hw - card 0 + type hw + card 0 } _EOF_ @@ -2197,25 +2297,25 @@ _EOF_ cat << _EOF_ > /etc/asound.conf ctl.eq { - type equal - controls "$HOME/.alsaequal.bin" + type equal + controls "/root/.alsaequal.bin" } pcm.plugequal { - type equal - slave.pcm "plughw:$SOUNDCARD_TARGET_CARD,$SOUNDCARD_TARGET_DEVICE" - controls "$HOME/.alsaequal.bin" + type equal + slave.pcm "plughw:$SOUNDCARD_TARGET_CARD,$SOUNDCARD_TARGET_DEVICE" + controls "/root/.alsaequal.bin" } pcm.!default { - type plug - slave.pcm plugequal - slave.channels 2 + type plug + slave.pcm plugequal + slave.channels 2 } ctl.!default { - type hw - card $SOUNDCARD_TARGET_CARD + type hw + card $SOUNDCARD_TARGET_CARD } _EOF_ @@ -2225,13 +2325,13 @@ _EOF_ cat << _EOF_ > /etc/asound.conf pcm.!default { - type hw - card $SOUNDCARD_TARGET_CARD - device $SOUNDCARD_TARGET_DEVICE + type hw + card $SOUNDCARD_TARGET_CARD + device $SOUNDCARD_TARGET_DEVICE } ctl.!default { - type hw - card $SOUNDCARD_TARGET_CARD + type hw + card $SOUNDCARD_TARGET_CARD } _EOF_ @@ -2239,13 +2339,11 @@ _EOF_ } - #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// #----------------------------------------------------------------------------------- - #info - + # info G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" "$INPUT_DEVICE_NAME ($INPUT_DEVICE_VALUE)" #----------------------------------------------------------------------------------- diff --git a/dietpi/func/dietpi-set_software b/dietpi/func/dietpi-set_software index b409c056a7..64da1412c7 100644 --- a/dietpi/func/dietpi-set_software +++ b/dietpi/func/dietpi-set_software @@ -106,8 +106,13 @@ $FP_SCRIPT setpermissions Applies required filesystem permissions to DietPi spe if [[ $INPUT_MODE_VALUE ]]; then + # - Jessie ARMv8: https://github.com/MichaIng/DietPi/issues/2665#issuecomment-477348864 + if (( $G_HW_ARCH == 3 && $G_DISTRO < 4 )); then + + INPUT_MODE_VALUE='http://archive.debian.org/debian/' + # - Set defaults? - if [[ $INPUT_MODE_VALUE == 'default' ]]; then + elif [[ $INPUT_MODE_VALUE == 'default' ]]; then if (( $G_HW_MODEL < 10 )); then @@ -121,17 +126,16 @@ $FP_SCRIPT setpermissions Applies required filesystem permissions to DietPi spe fi - # - Set raspbian + # - Set Raspbian if (( $G_HW_MODEL < 10 )); then echo "deb $INPUT_MODE_VALUE $G_DISTRO_NAME main contrib non-free rpi" > /etc/apt/sources.list - echo "deb https://archive.raspberrypi.org/debian/ $G_DISTRO_NAME main ui" > /etc/apt/sources.list.d/raspi.list # Update dietpi.txt entry G_CONFIG_INJECT 'CONFIG_APT_RASPBIAN_MIRROR=' "CONFIG_APT_RASPBIAN_MIRROR=$INPUT_MODE_VALUE" /DietPi/dietpi.txt - # - Set debian + # - Set Debian else cat << _EOF_ > /etc/apt/sources.list @@ -141,12 +145,14 @@ deb https://deb.debian.org/debian-security/ $G_DISTRO_NAME/updates main contrib deb $INPUT_MODE_VALUE $G_DISTRO_NAME-backports main contrib non-free _EOF_ - # Jessie, switch deb.debian.org to http: https://github.com/MichaIng/DietPi/issues/1285#issuecomment-351830101 + # Jessie: https://github.com/MichaIng/DietPi/issues/2665#issuecomment-477348864 if (( $G_DISTRO < 4 )); then - sed -i 's/https:/http:/g' /etc/apt/sources.list - - # - ARM64 packages no longer available: https://github.com/MichaIng/DietPi/issues/1915 + # - Jessie APT reports warning on httpS://deb.debian.org + sed -i 's|https://deb.debian.org|http://deb.debian.org|g' /etc/apt/sources.list + # - backports and updates have been dropped + sed -Ei '/jessie-(backports|updates)/d' /etc/apt/sources.list + # - ARMv8 has been dropped from security repo (( $G_HW_ARCH == 3 )) && sed -i '/debian-security/d' /etc/apt/sources.list # Buster, remove backports: https://github.com/MichaIng/DietPi/issues/1285#issuecomment-351830101 diff --git a/dietpi/func/dietpi-set_dphys-swapfile b/dietpi/func/dietpi-set_swapfile similarity index 52% rename from dietpi/func/dietpi-set_dphys-swapfile rename to dietpi/func/dietpi-set_swapfile index 778f3a8463..f6747eb501 100644 --- a/dietpi/func/dietpi-set_dphys-swapfile +++ b/dietpi/func/dietpi-set_swapfile @@ -14,38 +14,24 @@ # Usage: # - $1 = 0=disable, 1=enable+autosize, >=2=enable+size # - $2 = optional location - # - /DietPi/dietpi/func/dietpi-set_dphys-swapfile = Print current swap size and location + # - /DietPi/dietpi/func/dietpi-set_swapfile = Print current swap size and location #//////////////////////////////////// - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals - G_PROGRAM_NAME='DietPi-Swapfile' + G_PROGRAM_NAME='DietPi-Set_swapfile' G_CHECK_ROOT_USER G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- SWAP_SIZE=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') - SWAP_LOCATION="$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=' /DietPi/dietpi.txt | sed 's/^[^=]*=//')" + SWAP_LOCATION=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') - SWAP_SIZE_TARGET=$SWAP_SIZE - disable_error=1 G_CHECK_VALIDINT "$1" && SWAP_SIZE_TARGET=$1 - - SWAP_LOCATION_TARGET="$SWAP_LOCATION" - [[ $2 ]] && SWAP_LOCATION_TARGET=$2 - - Delete_Swapfile(){ - - G_RUN_CMD swapoff -a - G_DIETPI-NOTIFY 2 "Deleting existing swapfile ($SWAP_LOCATION)" - [[ -f $SWAP_LOCATION ]] && rm "$SWAP_LOCATION" - sed -i '/[[:blank:]]swap[[:blank:]]/d' /etc/fstab - systemctl daemon-reload - - } + disable_error=1 G_CHECK_VALIDINT "$1" && SWAP_SIZE_TARGET=$1 || SWAP_SIZE_TARGET=$SWAP_SIZE + [[ $2 ]] && SWAP_LOCATION_TARGET=$2 || SWAP_LOCATION_TARGET=$SWAP_LOCATION Update_DietPi_Conf(){ - # DietPi.txt G_CONFIG_INJECT 'AUTO_SETUP_SWAPFILE_SIZE=' "AUTO_SETUP_SWAPFILE_SIZE=$SWAP_SIZE" /DietPi/dietpi.txt G_CONFIG_INJECT 'AUTO_SETUP_SWAPFILE_LOCATION=' "AUTO_SETUP_SWAPFILE_LOCATION=$SWAP_LOCATION" /DietPi/dietpi.txt @@ -53,17 +39,17 @@ Update_Tmp(){ - #Set /tmp to 50% of RAM+SWAP: https://github.com/MichaIng/DietPi/issues/1027#issuecomment-369373082 + # Set /tmp to 50% of RAM+SWAP: https://github.com/MichaIng/DietPi/issues/1027#issuecomment-369373082 local mem_total=$(free -m | mawk '/Mem:/ {print $2;exit}') local swap_size=$(free -m | mawk '/Swap:/ {print $2;exit}') local tmp_target_size="$(( ( $mem_total + $swap_size ) / 2 ))M" G_DIETPI-NOTIFY 2 "Setting /tmp tmpfs size: $tmp_target_size" - sed -i -e "/[[:blank:]]\/tmp[[:blank:]]/ctmpfs \/tmp tmpfs defaults,size=$tmp_target_size,noatime,nodev,nosuid,mode=1777 0 0" /etc/fstab + sed -i "/[[:blank:]]\/tmp[[:blank:]]/ctmpfs \/tmp tmpfs defaults,size=$tmp_target_size,noatime,nodev,nosuid,mode=1777 0 0" /etc/fstab systemctl daemon-reload - mount -a - G_RUN_CMD mount -o remount,size=$tmp_target_size tmpfs /tmp + mount -a # Required if /tmp was somehow not mounted before. Will be skipped if already mounted + G_RUN_CMD mount -o remount /tmp # Required to apply new settings/size. "remount" required to preserve current content, or, doubled mount } @@ -71,66 +57,67 @@ G_DIETPI-NOTIFY 0 'Disable swapfile' - Delete_Swapfile + G_RUN_CMD swapoff -a + if [[ -f $SWAP_LOCATION ]]; then + + G_DIETPI-NOTIFY 2 "Deleting existing swapfile: $SWAP_LOCATION" + rm "$SWAP_LOCATION" + + fi + sed -i '/[[:blank:]]swap[[:blank:]]/d' /etc/fstab SWAP_SIZE=0 SWAP_LOCATION='/var/swap' - Update_DietPi_Conf - Update_Tmp - } Swap_Enable(){ - # - Create temp file for freespace check, and, fs_type scrape - > "$SWAP_LOCATION_TARGET" + local swap_dir="${SWAP_LOCATION_TARGET%/*}/" + local fs_type=$(findmnt -n -o FSTYPE -T "$swap_dir") - #Free spacey, checkey weckey - if ! G_CHECK_FREESPACE "$SWAP_LOCATION_TARGET" $SWAP_SIZE_TARGET; then + # Exclude devices + # - BBB + if (( $G_HW_MODEL == 71 )); then - G_DIETPI-NOTIFY 1 'Unable to generate swapfile due to insufficient disk space. Swap has be disabled.' + G_DIETPI-NOTIFY 1 "Disabled swapfile generation for: $G_HW_MODEL_DESCRIPTION" - #Exclude devices - # - BBB - elif (( $G_HW_MODEL == 71 )); then + # Exclude file systems + elif [[ $fs_type == 'btrfs' ]]; then + + G_DIETPI-NOTIFY 1 "Swapfile not supported on file system: $fs_type" + + # Free spacey, checkey weckey + elif ! G_CHECK_FREESPACE "$swap_dir" $SWAP_SIZE_TARGET; then - G_DIETPI-NOTIFY 2 "Disabled swapfile generation for $G_HW_MODEL_DESCRIPTION" + G_DIETPI-NOTIFY 1 'Unable to generate swapfile due to insufficient disk space. Swap has been disabled.' - #Create new swappey whappey + # Create new swappey whappey else SWAP_SIZE=$SWAP_SIZE_TARGET - SWAP_LOCATION="$SWAP_LOCATION_TARGET" + SWAP_LOCATION=$SWAP_LOCATION_TARGET G_DIETPI-NOTIFY 0 'Generating new swapfile' G_DIETPI-NOTIFY 2 "Size = $SWAP_SIZE MB" G_DIETPI-NOTIFY 2 "Location = $SWAP_LOCATION" - local fs_type="$(findmnt -n -o FSTYPE -T $SWAP_LOCATION)" - - #Pre-allocate for filesystems which do no support quick-allocate with fallocate + # - Pre-allocate for filesystems which do no support quick-allocate with fallocate if [[ $fs_type == 'f2fs' || $fs_type == 'xfs' || $fs_type == 'vfat' ]]; then - G_RUN_CMD dd if=/dev/zero of=$SWAP_LOCATION bs=4K count=$(( $SWAP_SIZE * 1024 / 4 )) + G_RUN_CMD dd if=/dev/zero of="$SWAP_LOCATION" bs=4K count=$(( $SWAP_SIZE * 1024 / 4 )) else - G_RUN_CMD fallocate -l $SWAP_SIZE'M' $SWAP_LOCATION + G_RUN_CMD fallocate -l $SWAP_SIZE'M' "$SWAP_LOCATION" fi - G_RUN_CMD mkswap $SWAP_LOCATION + G_RUN_CMD mkswap "$SWAP_LOCATION" chmod 600 "$SWAP_LOCATION" + G_RUN_CMD swapon "$SWAP_LOCATION" - G_RUN_CMD swapon $SWAP_LOCATION - - cat << _EOF_ >> /etc/fstab -$SWAP_LOCATION none swap sw 0 0 -_EOF_ - - Update_DietPi_Conf - Update_Tmp + echo "$SWAP_LOCATION none swap sw 0 0" >> /etc/fstab fi @@ -139,25 +126,28 @@ _EOF_ #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// - #Info mode - Print Size / Location + # Info mode - Print Size / Location if [[ ! $1 ]]; then - echo -e "$SWAP_SIZE $SWAP_LOCATION" + echo "$SWAP_SIZE $SWAP_LOCATION" - #Remove/Create swap + # Remove/Create swap else G_DIETPI-NOTIFY 3 "$G_PROGRAM_NAME" 'Apply' - #Always reset/remove existing swap + # - Always reset/remove existing swap Swap_Disable - #Auto size? + # - Auto size? (( $SWAP_SIZE_TARGET == 1 )) && SWAP_SIZE_TARGET=$(( 2048 - $(free -m | mawk '/Mem:/ {print $2;exit}') )) - #Configure new swapfile? + # - Configure new swapfile? (( $SWAP_SIZE_TARGET > 0 )) && Swap_Enable + Update_DietPi_Conf + Update_Tmp + fi #----------------------------------------------------------------------------------- exit 0 diff --git a/dietpi/misc/dietpi-arr_to_RAM b/dietpi/misc/dietpi-arr_to_RAM index d66fd41070..e9bb0ab209 100644 --- a/dietpi/misc/dietpi-arr_to_RAM +++ b/dietpi/misc/dietpi-arr_to_RAM @@ -1,8 +1,7 @@ #!/bin/bash { - #//////////////////////////////////// - # DietPi Move Arr to RAM + # DietPi Link Arr to RAM # #//////////////////////////////////// # Created by Daniel Knight / daniel.knight@dietpi.com / dietpi.com @@ -10,124 +9,287 @@ #//////////////////////////////////// # # Info: - # - Moves arr program database files to RAM (/tmp) with symlink, and, back to disk + # - Moves Sonarr, Radarr and Lidarr database files to RAM, leaving symlinks on disk + # - Reduces disk I/O and enhances database I/O performance + # - Creates a backup first and automatically restores from backup on next start in case of system crash + # NB: Not supported on Jessie: https://github.com/MichaIng/DietPi/issues/2689#issuecomment-487306241 # - # Usage: - # - dietpi-arr_to_RAM 1 = Move to RAM - # - dietpi-arr_to_RAM 0 = Move to Disk - #//////////////////////////////////// - - #Import DietPi-Globals --------------------------------------------------------------- - . /DietPi/dietpi/func/dietpi-globals - G_PROGRAM_NAME='DietPi-Arr_to_RAM' - G_INIT - G_CHECK_ROOT_USER - #Import DietPi-Globals --------------------------------------------------------------- - + USAGE=' +Usage: /DietPi/dietpi/misc/dietpi-arr_to_RAM [] +Available commands: + 1 [] Link (program) database(s) to RAM + 2 [] Update (program) database backup(s) + 0 [] Store (program) database(s) back to disk + enable Enable Link to RAM on boot + disable Disable Link to RAM on boot +Supported programs: + Apply to all supported and installed programs + sonarr Apply to Sonarr database only + radarr Apply to Radarr database only + lidarr Apply to Lidarr database only +' #//////////////////////////////////// + + # Import DietPi-Globals -------------------------------------------------------------- + #. /DietPi/dietpi/func/dietpi-globals # Skip globals for faster execution on early boot stage + PROGRAM_NAME='DietPi-Arr_to_RAM' + # Import DietPi-Globals -------------------------------------------------------------- + + # Grab input INPUT=$1 - if [[ ! $INPUT ]]; then + INPUT_PROG=$2 - exit 1 + EXIT_CODE=0 - fi - - aFP_FILES=( + # Print output + # - In case of error, sets EXIT_CODE as well + unset error + Print(){ - 'nzbdrone.db' - 'nzbdrone.db-shm' - 'nzbdrone.db-wal' + local message=$@ + [[ $error ]] && { message="[ERROR] $message"; EXIT_CODE=$error; } + unset error + echo "$(date '+%Y-%m-%d %T') | $PROGRAM_NAME: $message" - # - Lidarr - 'lidarr.db' - 'lidarr.db-shm' - 'lidarr.db-wal' + } - ) + # Check for required root or program specific permissions permissions + # - Handling systemd service always requires root permissions + # - Database backup updates can be done as program user when defined via $2 + (( $UID )) && [[ $INPUT != 2 || $USER != $INPUT_PROG ]] && { error=1 Print 'This script must run as root user. Please use: "sudo"'; exit 1; } - aFP_PROGRAM=( + # Boot service log file + FP_LOG='/var/tmp/dietpi/logs/dietpi-arr_to_RAM.log' - 'sonarr' - 'radarr' - 'lidarr' + # Program files array + declare -A aFILES=() + # - Sonarr/Radarr: Both use the same file names + [[ ${INPUT_PROG:-sonarr} == 'sonarr' ]] && aFILES[sonarr]='nzbdrone.db nzbdrone.db-shm nzbdrone.db-wal' + [[ ${INPUT_PROG:-radarr} == 'radarr' ]] && aFILES[radarr]='nzbdrone.db nzbdrone.db-shm nzbdrone.db-wal' + # - Lidarr + [[ ${INPUT_PROG:-lidarr} == 'lidarr' ]] && aFILES[lidarr]='lidarr.db lidarr.db-shm lidarr.db-wal' - ) + # Check for valid input program + (( ${#aFILES[@]} )) || { error=1 Print "Invalid input program ($INPUT_PROG). Aborting... +$USAGE"; exit 1; } - FP_SOURCE='' - FP_TARGET='' + FP_DISK='' + FP_RAM='' - Copy_To_Ram(){ + Link_To_Ram(){ - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD cp $FP_SOURCE ${FP_SOURCE}.bak - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD cp $FP_SOURCE $FP_TARGET - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD rm $FP_SOURCE - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD ln -sf $FP_TARGET $FP_SOURCE + Print "Linking $FP_DISK to RAM ($FP_RAM)..." + mv $FP_DISK ${FP_DISK}.bak || { error=$? Print "Creating backup failed for $FP_DISK. Skipping this file..."; return; } + ln -s $FP_RAM $FP_DISK || EXIT_CODE=$? + # chown link in case created by root but program user wants to store back to disk + chown -h $i $FP_DISK || EXIT_CODE=$? + cp -a --no-preserve=timestamps ${FP_DISK}.bak $FP_RAM || EXIT_CODE=$? } - for i in ${!aFP_PROGRAM[@]} - do + Toggle_Link_To_Ram(){ - systemctl stop ${aFP_PROGRAM[$i]} + local start_services='' - for j in ${!aFP_FILES[@]} + for i in ${!aFILES[@]} do - FP_SOURCE="$G_FP_DIETPI_USERDATA/${aFP_PROGRAM[$i]}/${aFP_FILES[$j]}" - FP_TARGET="/tmp/${aFP_PROGRAM[$i]}/${aFP_FILES[$j]}" + FP_DISK="/mnt/dietpi_userdata/$i" + FP_RAM="/tmp/${i}_db_link" - # - Copy to RAM + backup - if (( $INPUT == 1 )); then + # Skip non-installed program + [[ -d $FP_DISK ]] || continue - if [[ ! -d /tmp/${aFP_PROGRAM[$i]} ]]; then + Print "${i^} detected" + + # Update backup + if (( $INPUT == 2 )); then + + if [[ -d $FP_RAM ]]; then + + Print "Updating ${i^} database backups..." + for j in ${aFILES[$i]} + do + + FP_RAM="/tmp/${i}_db_link/$j" + [[ -f $FP_RAM ]] || { Print "$FP_RAM not found. Skipping this file..."; continue; } + cp -a $FP_RAM $FP_DISK/$j.bak || EXIT_CODE=$? + + done + Print "Updated ${i^} database backups." + + else - G_RUN_CMD mkdir -p /tmp/${aFP_PROGRAM[$i]} + Print "${i^} database is not in RAM. Skipping this program..." fi + continue - if [[ -f $FP_TARGET ]]; then + fi - G_DIETPI-NOTIFY 2 "$FP_SOURCE already at location ($FP_TARGET)" + # If active, stop program before handling database and restart afterwards + if pgrep -f $i &> /dev/null; then - elif [[ ! -L $FP_SOURCE && -f $FP_SOURCE ]]; then + Print "Stopping ${i^} service..." + start_services+=" $i" + systemctl stop $i || { error=$? Print "Stopping ${i^} service failed. Skipping this program..."; continue; } - Copy_To_Ram + fi - # - recover + copy to RAM - elif [[ -f ${FP_SOURCE}.bak ]]; then + # Link to RAM + backup + if (( $INPUT == 1 )); then - rm $FP_SOURCE &> /dev/null + Print "Linking ${i^} database to RAM..." + # - Pre-create RAM dir + [[ -d $FP_RAM ]] || mkdir -p $FP_RAM || { error=$? Print "Pre-creating RAM directory for ${i^} failed ($FP_RAM). Skipping this program..."; continue; } + # - chown dir in case created by root but program user wants to store back to disk + chown $i $FP_RAM || EXIT_CODE=$? - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD cp ${FP_SOURCE}.bak $FP_SOURCE - Copy_To_Ram + for j in ${aFILES[$i]} + do - fi + FP_DISK="/mnt/dietpi_userdata/$i/$j" + FP_RAM="/tmp/${i}_db_link/$j" + local fp_target='' + + # - Source exists and is no symlink, expected situation + if [[ -f $FP_DISK && ! -L $FP_DISK ]]; then + + Link_To_Ram + + # - Link + target exists, should only happen when running the script two times in same session + elif [[ -L $FP_DISK ]] && fp_target=$(readlink -e $FP_DISK); then + + if [[ $fp_target == $FP_RAM ]]; then + + Print "$FP_DISK already linked to RAM ($FP_RAM). Skipping this file..." + + # - Failsafe: Restore file from wrong symlink, should never occur but required for this script to function + else + + Print "$FP_DISK already linked to $fp_target. Restoring original file location before linking to RAM..." + rm $FP_DISK || { error=$? Print "Removing symlink failed ($FP_DISK). Skipping this file..."; continue; } + mv $fp_target $FP_DISK || { error=$? Print "Restoring original file failed ($fp_target). Skipping this file..."; continue; } + Link_To_Ram + + fi + + # - Source does not exist or is orphaned link, should only happen after crash + elif [[ -f ${FP_DISK}.bak ]]; then + + Print "$FP_DISK not found. Recovering from backup first (${FP_DISK}.bak)..." + # - Remove possible orphaned symlink + [[ ! -L $FP_DISK ]] || rm $FP_DISK || { error=$? Print "Removing orphaned symlink failed ($FP_DISK). Skipping this file..."; continue; } + # - Recover from backup + mv ${FP_DISK}.bak $FP_DISK || { error=$? Print "Recovering file from backup failed (${FP_DISK}.bak). Skipping this file..."; continue; } + Link_To_Ram - systemctl start ${aFP_PROGRAM[$i]} + else - # - Save to disk + Print "$FP_DISK not found. Skipping this file..." + + fi + + done + + Print "Linked ${i^} database to RAM." + + # Store back to disk elif (( $INPUT == 0 )); then - if [[ ! -f $FP_TARGET ]]; then + if [[ -d $FP_RAM ]]; then - G_DIETPI-NOTIFY 2 "$FP_TARGET does not exist." + Print "Storing database from RAM ($FP_RAM) back to disk ($FP_DISK)..." + # - "-u" will only copy newer files, thus actually used by program. + # - "--remove-destination" will remove expected existing symlinks. + cp -au --remove-destination $FP_RAM/. $FP_DISK || { error=$? Print "Storing ${i^} database from RAM back to disk failed."; continue; } + rm -R $FP_RAM + Print "Stored ${i^} database from RAM back to disk." else - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD rm $FP_SOURCE - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD cp $FP_TARGET $FP_SOURCE - G_ERROR_HANDLER_INFO_ONLY=1 G_RUN_CMD rm $FP_TARGET + Print "${i^} database is not in RAM. Skipping this program..." fi fi - chown -R ${aFP_PROGRAM[$i]}:dietpi $FP_TARGET $FP_SOURCE &> /dev/null - done - done + # Failsafe: When restoring to disk, "sync" now to prevent async issues! + (( $INPUT == 0 )) && sync + + # Start programs we stopped before + # - NB: Due to Before=, *arr.service waits for dietpi-arr_to_RAM.service to finish, timing it out. + # - "--no-block" allows dietpi-arr_to_RAM.service to only enqueue *arr.service starts and finish, to allow them starting afterwards. + if [[ $start_services ]]; then + + Print "Enqueuing$start_services service start(s)..." + systemctl --no-block start $start_services + systemctl -q is-active dietpi-postboot && /DietPi/dietpi/dietpi-process_tool 1 + + fi - unset aFP_FILES - unset aFP_PROGRAM + } + + Enable_On_Boot(){ + + cat << _EOF_ > /etc/systemd/system/dietpi-arr_to_RAM.service +[Unit] +Description=DietPi-Arr_to_RAM +Requisite=dietpi-ramdisk.service tmp.mount +After=dietpi-ramdisk.service tmp.mount +Before=dietpi-preboot.service sonarr.service radarr.service lidarr.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=-/bin/dash -c '/DietPi/dietpi/misc/dietpi-arr_to_RAM 1 2>&1 >> $FP_LOG' +ExecStop=/bin/dash -c '/DietPi/dietpi/misc/dietpi-arr_to_RAM 0 2>&1 > $FP_LOG' + +[Install] +WantedBy=multi-user.target +_EOF_ + systemctl daemon-reload + systemctl enable dietpi-arr_to_RAM || EXIT_CODE=$? + systemctl start dietpi-arr_to_RAM || EXIT_CODE=$? + + } + + Disable_On_Boot(){ + + if [[ -f /etc/systemd/system/dietpi-arr_to_RAM.service ]]; then + + systemctl stop dietpi-arr_to_RAM || EXIT_CODE=$? + systemctl disable dietpi-arr_to_RAM || EXIT_CODE=$? + rm /etc/systemd/system/dietpi-arr_to_RAM.service || EXIT_CODE=$? + + fi + + } + + #///////////////////////////////////////////////////////////////////////////////////// + # Main Loop + #///////////////////////////////////////////////////////////////////////////////////// + # - Toggle Link to RAM + if [[ $INPUT == [012] ]]; then + + Toggle_Link_To_Ram + (( $EXIT_CODE )) && Print '[ERROR] An issue has occurred. Please check the above output for details.' + + # - Enable/Disable Link to RAM on boot + elif [[ $INPUT == 'enable' || $INPUT == 'disable' ]]; then + + ${INPUT^}_On_Boot + (( $EXIT_CODE )) && Print "[ERROR] An issue has occurred. Please check the log for details: $FP_LOG" + + else + + error=1 Print "Invalid input command (${INPUT:-}). Aborting... +$USAGE" + + fi + #----------------------------------------------------------------------------------- + exit $EXIT_CODE + #----------------------------------------------------------------------------------- } diff --git a/dietpi/misc/dietpi-nordvpn b/dietpi/misc/dietpi-nordvpn index e03808127d..0963e2ba22 100644 --- a/dietpi/misc/dietpi-nordvpn +++ b/dietpi/misc/dietpi-nordvpn @@ -15,13 +15,13 @@ # - /DietPi/dietpi/misc/dietpi-nordvpn #//////////////////////////////////// - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals G_PROGRAM_NAME='DietPi-NordVPN' G_CHECK_ROOT_USER G_CHECK_ROOTFS_RW G_INIT - #Import DietPi-Globals --------------------------------------------------------------- + # Import DietPi-Globals -------------------------------------------------------------- FP_SETTINGS_DIETPI='/var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn/settings_dietpi.conf' FP_SETTINGS_OVPN='/var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn/settings_ovpn.conf' @@ -31,12 +31,20 @@ PROTOCOL='udp' NET_DEV='tun0' + NORDVPN_SERVICE=0 NORDVPN_CONNECTED=0 MAX_WAIT_FOR_CONNECTION=5 + WAN_IP='' + + Update_Wan_Ip(){ + + WAN_IP=$(curl -sLm 2 https://dietpi.com/myip.php 2>&1) + + } Init(){ - #Check installed + # Check installed until grep -q 'aSOFTWARE_INSTALL_STATE\[171\]=2' /DietPi/dietpi/.installed do @@ -46,13 +54,16 @@ else - TARGETMENUID=-1 + TARGETMENUID=-1 #Exit path without save. break fi done + # Check service exists + [[ -f '/lib/systemd/system/dietpi-nordvpn.service' ]] && NORDVPN_SERVICE=1 + Read_Settings } @@ -60,16 +71,10 @@ Check_Connected(){ NORDVPN_CONNECTED=0 - local status=1 #if systemctl status dietpi-nordvpn | grep -qi 'initialization sequence completed'; then - if ip r | grep -q $NET_DEV; then - - status=0 - NORDVPN_CONNECTED=1 + ip r s dev $NET_DEV &>/dev/null && NORDVPN_CONNECTED=1 - fi - - return $status + return $(( ! $NORDVPN_CONNECTED )) } @@ -77,7 +82,7 @@ Save_Settings(){ - systemctl stop dietpi-nordvpn + (( $NORDVPN_SERVICE )) && systemctl stop dietpi-nordvpn cat << _EOF_ > $FP_SETTINGS_OVPN ${NORDVPN_USERNAME//\'/\'\\\'\'} @@ -90,7 +95,7 @@ NORDVPN_PASSWORD='${NORDVPN_PASSWORD//\'/\'\\\'\'}' NORDVPN_SERVER='$NORDVPN_SERVER' PROTOCOL='$PROTOCOL' _EOF_ - G_CONFIG_INJECT 'auth-user-pass[[:blank:]]' "auth-user-pass $FP_SETTINGS_OVPN" /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER + G_CONFIG_INJECT 'auth-user-pass' "auth-user-pass $FP_SETTINGS_OVPN" /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER chmod 600 $FP_SETTINGS_OVPN $FP_SETTINGS_DIETPI /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER chown root:root $FP_SETTINGS_OVPN $FP_SETTINGS_DIETPI /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER @@ -101,16 +106,13 @@ Description=NordVPN (DietPi) After=network.target dietpi-boot.service [Service] -User=root -Type=simple ExecStart=$(which openvpn) /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER [Install] WantedBy=multi-user.target _EOF_ - systemctl daemon-reload - G_RUN_CMD systemctl enable dietpi-nordvpn + NORDVPN_SERVICE=1 G_RUN_CMD systemctl restart dietpi-nordvpn for (( i=1; i<=$MAX_WAIT_FOR_CONNECTION; i++ )) @@ -137,30 +139,22 @@ _EOF_ # Whip #///////////////////////////////////////////////////////////////////////////////////// TARGETMENUID=0 - LAST_SELECTED_NAME=0 + LAST_SELECTED_NAME='Username' Menu_Exit(){ G_WHIP_SIZE_X_MAX=50 - if G_WHIP_YESNO "Exit $G_PROGRAM_NAME?"; then - - #exit - TARGETMENUID=-1 - - else - - #Return to Main Menu - TARGETMENUID=0 - - fi + G_WHIP_YESNO "Exit $G_PROGRAM_NAME?" && TARGETMENUID=-1 # Exit } - #TARGETMENUID=0 + # TARGETMENUID=0 Menu_Main(){ - local text_status='Status:\n' - if Check_Connected; then + Update_Wan_Ip + + local text_status="Status:\n - WAN IP: $WAN_IP\n" + if (( $NORDVPN_SERVICE )) && Check_Connected; then text_status+=" - Connected : $NORDVPN_SERVER\n" @@ -172,20 +166,12 @@ _EOF_ if [[ -f /sys/class/net/$NET_DEV/statistics/rx_bytes && -f /sys/class/net/$NET_DEV/statistics/tx_bytes ]]; then net_rx_byte=$( 0 )); then - - net_rx_mb="$(( $net_rx_byte / 1024 / 1024 ))MB" - - fi + disable_error=1 G_CHECK_VALIDINT "$net_rx_byte" 1 && net_rx_mb="$(( $net_rx_byte / 1024 / 1024 ))MB" + net_tx_byte=$( 0 )); then - - net_tx_mb="$(( $net_tx_byte / 1024 / 1024 ))MB" - - fi + disable_error=1 G_CHECK_VALIDINT "$net_tx_byte" 1 && net_tx_mb="$(( $net_tx_byte / 1024 / 1024 ))MB" fi @@ -193,17 +179,25 @@ _EOF_ else - text_status+=' - Disconnected\n' - text_status+=' - NordVPN subscription: https://go.nordvpn.net/aff_c?offer_id=15&aff_id=5305&url_id=902' + (( $NORDVPN_SERVICE )) && text_status+=' - Disconnected' || text_status+=' - Not configured' + text_status+='\n - NordVPN subscription: https://go.nordvpn.net/aff_c?offer_id=15&aff_id=5305&url_id=902' fi G_WHIP_MENU_ARRAY=('' '●─ Global Options ') G_WHIP_MENU_ARRAY+=('Username' ": [$NORDVPN_USERNAME]") - G_WHIP_MENU_ARRAY+=('Password' ": [$NORDVPN_PASSWORD]") + G_WHIP_MENU_ARRAY+=('Password' ": [${NORDVPN_PASSWORD//?/*}]") G_WHIP_MENU_ARRAY+=('Server' ": [$NORDVPN_SERVER]") - G_WHIP_MENU_ARRAY+=('Refresh' ': Update VPN connection status') - (( $NORDVPN_CONNECTED )) && G_WHIP_MENU_ARRAY+=('Disconnect' '') + if (( $NORDVPN_SERVICE )); then + + local autostart_enabled=0 autostart_text='Off' + systemctl -q is-enabled dietpi-nordvpn && { autostart_enabled=1 autostart_text='On'; } + G_WHIP_MENU_ARRAY+=('Auto start' ": [$autostart_text]") + + G_WHIP_MENU_ARRAY+=('Refresh' ': Update VPN connection status') + (( $NORDVPN_CONNECTED )) && G_WHIP_MENU_ARRAY+=('Disconnect' '') + + fi G_WHIP_MENU_ARRAY+=('' '●─ Save Settings ') G_WHIP_MENU_ARRAY+=('Apply' ': Save settings and restart VPN connection') @@ -211,37 +205,42 @@ _EOF_ G_WHIP_BUTTON_CANCEL_TEXT='Exit' if G_WHIP_MENU "$text_status"; then - LAST_SELECTED_NAME="$G_WHIP_RETURNED_VALUE" + LAST_SELECTED_NAME=$G_WHIP_RETURNED_VALUE if [[ $G_WHIP_RETURNED_VALUE == 'Apply' ]]; then Save_Settings - elif [[ $G_WHIP_RETURNED_VALUE == 'Username' ]]; then + elif [[ $G_WHIP_RETURNED_VALUE == 'Auto start' ]]; then - G_WHIP_DEFAULT_ITEM=$NORDVPN_USERNAME - if G_WHIP_INPUTBOX 'Please enter your NordVPN username:'; then + if (( $autostart_enabled )); then + + G_RUN_CMD systemctl disable dietpi-nordvpn + + else - NORDVPN_USERNAME=$G_WHIP_RETURNED_VALUE + G_RUN_CMD systemctl enable dietpi-nordvpn fi - elif [[ $G_WHIP_RETURNED_VALUE == 'Password' ]]; then + elif [[ $G_WHIP_RETURNED_VALUE == 'Username' ]]; then - if G_WHIP_PASSWORD 'Please enter your NordVPN password:'; then + G_WHIP_DEFAULT_ITEM=$NORDVPN_USERNAME + G_WHIP_INPUTBOX 'Please enter your NordVPN username:' && NORDVPN_USERNAME=$G_WHIP_RETURNED_VALUE - NORDVPN_PASSWORD=$result - unset result + elif [[ $G_WHIP_RETURNED_VALUE == 'Password' ]]; then - fi + G_WHIP_PASSWORD 'Please enter your NordVPN password:' && NORDVPN_PASSWORD=$result + unset result elif [[ $G_WHIP_RETURNED_VALUE == 'Disconnect' ]]; then G_RUN_CMD systemctl stop dietpi-nordvpn + LAST_SELECTED_NAME='Refresh' elif [[ $G_WHIP_RETURNED_VALUE == 'Server' ]]; then - # Select protocol + # - Select protocol G_WHIP_MENU_ARRAY=( 'UDP' ': Recommended' @@ -250,31 +249,22 @@ _EOF_ ) G_WHIP_DEFAULT_ITEM=$PROTOCOL - if G_WHIP_MENU 'Please select the connection protocol type:'; then - - PROTOCOL=${G_WHIP_RETURNED_VALUE,,} + G_WHIP_MENU 'Please select the connection protocol type:' && PROTOCOL=${G_WHIP_RETURNED_VALUE,,} - fi - - # Select server - G_WHIP_MENU_ARRAY=() + # - Select server G_DIETPI-NOTIFY 2 'Populating NordVPN server list, please wait...' cd /etc/openvpn/ovpn_$PROTOCOL + G_WHIP_MENU_ARRAY=() for i in * do G_WHIP_MENU_ARRAY+=("$i" '') done - cd /tmp/$G_PROGRAM_NAME G_WHIP_DEFAULT_ITEM=$NORDVPN_SERVER - if G_WHIP_MENU 'Please select a NordVPN server to use'; then - - NORDVPN_SERVER=$G_WHIP_RETURNED_VALUE - - fi + G_WHIP_MENU 'Please select a NordVPN server to use' && NORDVPN_SERVER=$G_WHIP_RETURNED_VALUE fi diff --git a/dietpi/patch_file b/dietpi/patch_file index 70de9646b2..7bf48f504b 100644 --- a/dietpi/patch_file +++ b/dietpi/patch_file @@ -29,6 +29,9 @@ # Prevent backup prompts during patching e.g. from DietPi-Software reinstalls export G_PROMPT_BACKUP_DISABLED=1 + # Prevent initial and final service crontrol during DietPi-Software reinstalls + export G_SERVICE_CONTROL=0 + # Export subversion, required for pre-v6.14 export G_DIETPI_VERSION_SUB=$INPUT @@ -71,6 +74,15 @@ } + # Move Jessie systems to "jessie-support" branch: https://github.com/MichaIng/DietPi/issues/2332 + # - We check/apply this already via pre-patches but do as well here since older DietPi version do not yet run pre-patches. + if (( $G_DISTRO < 4 )) && ! grep -q '^[[:blank:]]*DEV_GITBRANCH=jessie-support' /DietPi/dietpi.txt; then + + G_CONFIG_INJECT 'DEV_GITBRANCH=' 'DEV_GITBRANCH=jessie-support' /DietPi/dietpi.txt + Restart_DietPi_Update + + fi + # Pre-v6.17: New ".version" system # - As loaded pre-v6.17 dietpi-update will overwrite ".version" to previous 2 line system, we need to rerun dietpi-update. # Pre-v6.20: New $G_DIETPI_INSTALL_STAGE system @@ -102,7 +114,7 @@ #------------------------------------------------------------------------------- #Asus TB G_HW_MODEL change - if [[ -f /etc/.dietpi_hw_model_identifier && $(sed -n 1p /etc/.dietpi_hw_model_identifier) == 100 ]]; then + if [[ -f '/etc/.dietpi_hw_model_identifier' && $(sed -n 1p /etc/.dietpi_hw_model_identifier) == 100 ]]; then G_HW_MODEL=52 echo $G_HW_MODEL > /etc/.dietpi_hw_model_identifier @@ -116,12 +128,12 @@ sed -i '/#DietPi Additions/Q' /etc/bash.bashrc #------------------------------------------------------------------------------- #Fix doubled and renamed config files: https://github.com/MichaIng/DietPi/commit/68148cec6b49afc787deca638456e1c4689e1cab#diff-8370b86e635383d521462994afe04a2d - [[ -f /etc/apt/apt.conf.d/99force-ipv ]] && rm /etc/apt/apt.conf.d/99force-ipv - [[ -f /etc/sysctl.d/97-dietpi.conf ]] && rm /etc/sysctl.d/97-dietpi.conf + [[ -f '/etc/apt/apt.conf.d/99force-ipv' ]] && rm /etc/apt/apt.conf.d/99force-ipv + [[ -f '/etc/sysctl.d/97-dietpi.conf' ]] && rm /etc/sysctl.d/97-dietpi.conf #------------------------------------------------------------------------------- #Core_ENV update: https://github.com/MichaIng/DietPi/pull/1419 # - consoleblank disable x86_64 - if [[ -f /etc/default/grub ]]; then + if [[ -f '/etc/default/grub' ]]; then G_CONFIG_INJECT 'GRUB_CMDLINE_LINUX_DEFAULT=' 'GRUB_CMDLINE_LINUX_DEFAULT="consoleblank=0 quiet"' /etc/default/grub G_CONFIG_INJECT 'GRUB_CMDLINE_LINUX=' 'GRUB_CMDLINE_LINUX="net.ifnames=0"' /etc/default/grub @@ -148,7 +160,7 @@ #------------------------------------------------------------------------------- #locale rework/reset: https://github.com/MichaIng/DietPi/issues/1430#issuecomment-364763302 - [[ -f /etc/environment ]] && mv /etc/environment /mnt/dietpi_userdata/environment.bak + [[ -f '/etc/environment' ]] && mv /etc/environment /mnt/dietpi_userdata/environment.bak > /etc/environment /DietPi/dietpi/func/dietpi-set_software locale en_GB.UTF-8 @@ -160,7 +172,7 @@ systemctl enable openvpn &> /dev/null; systemctl start openvpn &> /dev/null #------------------------------------------------------------------------------- #https://dietpi.com/phpbb/viewtopic.php?f=11&t=2772&p=10646#p10646 - [[ -f /etc/apt/sources.list.d/openmediavault.list ]] && rm /etc/apt/sources.list.d/openmediavault.list + [[ -f '/etc/apt/sources.list.d/openmediavault.list' ]] && rm /etc/apt/sources.list.d/openmediavault.list #------------------------------------------------------------------------------- #DietPi-Software removals: https://github.com/MichaIng/DietPi/issues/1491 if [[ -f /DietPi/dietpi/.installed ]]; then @@ -177,7 +189,7 @@ fi #------------------------------------------------------------------------------- #Nodered lacks homedir, create it: https://github.com/MichaIng/DietPi/issues/1446#issuecomment-366370800 - if getent passwd nodered &> /dev/null && [[ ! -d /home/nodered ]]; then + if getent passwd nodered &> /dev/null && [[ ! -d '/home/nodered' ]]; then mkdir -p /home/nodered chown -R nodered:nodered /home/nodered @@ -193,7 +205,7 @@ #------------------------------------------------------------------------------- #Switch from rc.local to own postboot script: https://github.com/MichaIng/DietPi/issues/1376 G_WHIP_MSG 'DietPi will not use "/etc/rc.local" for its own scripts anymore.\n\nHowever, in case you manually added something, we safe a backup to "/mnt/dietpi_userdata/rc.local.bak", from where you can copy & paste back to the cleaned "/etc/rc.local".\n\nIt will work as before.' - [[ -f /etc/rc.local ]] && mv /etc/rc.local /mnt/dietpi_userdata/rc.local.bak + [[ -f '/etc/rc.local' ]] && mv /etc/rc.local /mnt/dietpi_userdata/rc.local.bak cat << _EOF_ > /etc/rc.local #!/bin/sh -e # @@ -216,7 +228,7 @@ _EOF_ if (( $G_DIETPI_INSTALL_STAGE == 2 )) && grep -q '^aSOFTWARE_INSTALL_STATE\[168\]=2' /DietPi/dietpi/.installed; then - [[ -d /var/lib/dietpi/postboot.d ]] || mkdir /var/lib/dietpi/postboot.d + [[ -d '/var/lib/dietpi/postboot.d' ]] || mkdir /var/lib/dietpi/postboot.d cat << _EOF_ > /var/lib/dietpi/postboot.d/moode #!/bin/bash #moOde additions @@ -268,7 +280,7 @@ _EOF_ fi #------------------------------------------------------------------------------- #Add certificate combining for Lighttpd to CertBot auto renewal: https://github.com/MichaIng/DietPi/pull/1553 - if [[ -f /DietPi/dietpi/.dietpi-letsencrypt ]]; then + if [[ -f '/DietPi/dietpi/.dietpi-letsencrypt' ]]; then # - Switch Minio to new certbot.service.d/ hook: if (( $G_DISTRO > 3 )) && grep -q '^aSOFTWARE_INSTALL_STATE\[158\]=2' /DietPi/dietpi/.installed; then @@ -355,7 +367,7 @@ _EOF_ sed -i '/[[:space:]]dphys-swapfile[[:space:]]/d' /etc/fstab local swap_size=0 local swap_location='/var/swap' - if [[ -f /etc/dphys-swapfile ]]; then + if [[ -f '/etc/dphys-swapfile' ]]; then swap_size=$(grep -m1 '^[[:blank:]]*CONF_SWAPSIZE=' /etc/dphys-swapfile | sed 's/^[^=]*=//') swap_location=$(grep -m1 '^[[:blank:]]*CONF_SWAPFILE=' /etc/dphys-swapfile | sed 's/^[^=]*=//') @@ -367,13 +379,13 @@ _EOF_ #Re-Apply swap to set /tmp tmpfs size: https://github.com/MichaIng/DietPi/issues/1027#issuecomment-369435049 # + Force auto swapfile size https://github.com/MichaIng/DietPi/issues/1593#issuecomment-371516418 - /DietPi/dietpi/func/dietpi-set_dphys-swapfile 1 + /DietPi/dietpi/func/dietpi-set_swapfile 1 G_AGP dphys-swapfile #------------------------------------------------------------------------------- #Reinstalls # v6.20 Shairport-sync: https://github.com/MichaIng/DietPi/issues/1620#issuecomment-373086888 - # Squeezebox server: + # v6.23 Squeezebox server: # v6.20 AmiBerry 2.18: https://github.com/MichaIng/DietPi/issues/1410#issuecomment-374060452 # Mopidy: https://github.com/MichaIng/DietPi/issues/1625 # v6.17 MPD: https://github.com/MichaIng/DietPi/issues/1614 @@ -382,7 +394,7 @@ _EOF_ killall -qw squeezeboxserver [[ -f /var/lib/dietpi/dietpi-software/services/squeezeboxserver.service ]] && rm /var/lib/dietpi/dietpi-software/services/squeezeboxserver.service - /DietPi/dietpi/dietpi-software reinstall 35 118 + /DietPi/dietpi/dietpi-software reinstall 118 fi #------------------------------------------------------------------------------- @@ -399,10 +411,10 @@ _EOF_ sed -i '/dietpi/d' /etc/sudoers #Our config must not start with '99-' to assure priority higher than '99-sysctl.conf' # - New config is installed automatically via v6.9 update system. - [[ -f /etc/sysctl.d/99-dietpi.conf ]] && rm /etc/sysctl.d/99-dietpi.conf + [[ -f '/etc/sysctl.d/99-dietpi.conf' ]] && rm /etc/sysctl.d/99-dietpi.conf #------------------------------------------------------------------------------- # - RPi resolve gettext error: https://github.com/MichaIng/DietPi/issues/1631#issuecomment-373965406 - [[ -f /etc/profile.d/wifi-country.sh ]] && rm /etc/profile.d/wifi-country.sh + [[ -f '/etc/profile.d/wifi-country.sh' ]] && rm /etc/profile.d/wifi-country.sh #------------------------------------------------------------------------------- elif (( $G_DIETPI_VERSION_SUB == 5 )); then @@ -423,8 +435,8 @@ _EOF_ #Add Dropbear ecdsa and dss host keys, if missing: https://github.com/MichaIng/DietPi/issues/1670 if (( $G_DIETPI_INSTALL_STAGE == 2 )) && grep -q '^aSOFTWARE_INSTALL_STATE\[104\]=2' /DietPi/dietpi/.installed; then - [[ -f /etc/dropbear/dropbear_ecdsa_host_key ]] || dropbearkey -t ecdsa -f /etc/dropbear/dropbear_ecdsa_host_key &> /dev/null - [[ -f /etc/dropbear/dropbear_dss_host_key ]] || dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key &> /dev/null + [[ -f '/etc/dropbear/dropbear_ecdsa_host_key' ]] || dropbearkey -t ecdsa -f /etc/dropbear/dropbear_ecdsa_host_key &> /dev/null + [[ -f '/etc/dropbear/dropbear_dss_host_key' ]] || dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key &> /dev/null fi #------------------------------------------------------------------------------- @@ -457,7 +469,7 @@ _EOF_ #Deluge systemd service update: https://github.com/MichaIng/DietPi/issues/1658 # + Service fix for in v6.6 https://github.com/MichaIng/DietPi/issues/1689#issuecomment-379024795 # => Fixed with reinstall on v6.21 => v6.22 - [[ -f /var/lib/dietpi/dietpi-software/services/deluge.service ]] && rm /var/lib/dietpi/dietpi-software/services/deluge.service + [[ -f '/var/lib/dietpi/dietpi-software/services/deluge.service' ]] && rm /var/lib/dietpi/dietpi-software/services/deluge.service #------------------------------------------------------------------------------- elif (( $G_DIETPI_VERSION_SUB == 7 )); then @@ -525,7 +537,7 @@ _EOF_ rm -f /etc/profile.d/99-dietpi* # - Enable bash-completion for non-login shells: # - NB: It is called twice on login shells then, but breaks directly if called already once. - [[ -f /etc/profile.d/bash_completion.sh ]] && ln -sf /etc/profile.d/bash_completion.sh /etc/bashrc.d/dietpi-bash_completion.sh + [[ -f '/etc/profile.d/bash_completion.sh' ]] && ln -sf /etc/profile.d/bash_completion.sh /etc/bashrc.d/dietpi-bash_completion.sh #------------------------------------------------------------------------------- #Sparky unmute fix (re: @sudeep) # v2: https://github.com/MichaIng/DietPi/pull/1779 @@ -547,12 +559,12 @@ _EOF_ #Reinstalls # RPi (apply to all) LXDE missing icons under pcmanfm reinstall: https://github.com/MichaIng/DietPi/issues/1558#issuecomment-390328173 # v6.12 AirSonic - # SubSonic + # v6.23 SubSonic # Cava # CloudPrint # TightVNC/VNC4/RealVNC: https://github.com/MichaIng/DietPi/pull/1798#issuecomment-392594878 # v6.19 Xserver: https://github.com/MichaIng/DietPi/issues/1823 - (( $G_DIETPI_INSTALL_STAGE == 2 )) && /DietPi/dietpi/dietpi-software reinstall 23 27 28 34 119 120 137 + (( $G_DIETPI_INSTALL_STAGE == 2 )) && /DietPi/dietpi/dietpi-software reinstall 23 27 28 119 120 137 #------------------------------------------------------------------------------- #Initially allow non-root users to obtain network details as well: https://github.com/MichaIng/DietPi/commit/15c0d495c33d3091e219c87bb2d09a22f8d27e9c chmod -f 666 /{DietPi,boot}/dietpi/.network @@ -595,7 +607,7 @@ _EOF_ fi #------------------------------------------------------------------------------- #Fix Apache2 logging to "/error.log" instead of "/var/log/apache2/error.log": https://github.com/MichaIng/DietPi/commit/c991bd7dc579dbdc7c239e4c887b0962fa204006 - if [[ -d /etc/apache2/sites-available ]]; then + if [[ -d '/etc/apache2/sites-available' ]]; then for vhost in /etc/apache2/sites-available/*.conf do @@ -607,7 +619,7 @@ _EOF_ fi #------------------------------------------------------------------------------- #Disable "initial_turbo" option for RPi within config.txt, as it currently prevents CPU throttle down: https://github.com/MichaIng/DietPi/issues/1836 - if [[ -f /DietPi/config.txt ]] && grep -q '^[[:blank:]]*initial_turbo' /DietPi/config.txt; then + if [[ -f '/DietPi/config.txt' ]] && grep -q '^[[:blank:]]*initial_turbo' /DietPi/config.txt; then sed -i '/^[[:blank:]]*initial_turbo/d' /DietPi/config.txt echo -e '\n# Initial turbo currently leads to CPU not being throttled down by CPU governor: https://github.com/MichaIng/DietPi/issues/1836\n#initial_turbo=20' >> /DietPi/config.txt @@ -927,7 +939,7 @@ _EOF_ (( $G_DIETPI_INSTALL_STAGE == 2 )) && /DietPi/dietpi/dietpi-software reinstall 146 #------------------------------------------------------------------------------- #Update DietPi-Sync save file to new format - if [[ -f /DietPi/dietpi/.dietpi-sync_settings ]] && ! grep -q '^FP_SOURCE=' /DietPi/dietpi/.dietpi-sync_settings; then + if [[ -f '/DietPi/dietpi/.dietpi-sync_settings' ]] && ! grep -q '^FP_SOURCE=' /DietPi/dietpi/.dietpi-sync_settings; then cp /DietPi/dietpi/.dietpi-sync_settings /DietPi/dietpi/.dietpi-sync_settings_bk cat << _EOF_ > /DietPi/dietpi/.dietpi-sync_settings @@ -947,7 +959,7 @@ _EOF_ #------------------------------------------------------------------------------- #Move to new WiFi cred array system and db store: https://github.com/MichaIng/DietPi/issues/368 - if [[ ! -f /var/lib/dietpi/dietpi-wifi.db ]]; then + if [[ ! -f '/var/lib/dietpi/dietpi-wifi.db' ]]; then cat << _EOF_ > /var/lib/dietpi/dietpi-wifi.db aWIFI_SSID[0]='$(grep -m1 '^[[:blank:]]*AUTO_SETUP_NET_WIFI_SSID=' /DietPi/dietpi.txt | sed 's/^[^=]*=//')' @@ -1151,7 +1163,7 @@ _EOF_ #------------------------------------------------------------------------------- # - Remove mysql.service as we use mariadb.service, both cannot exist: https://github.com/MichaIng/DietPi/issues/1913#issuecomment-441343798 - if [[ -f /etc/init.d/mysql ]] && (( $G_DISTRO >= 4 )); then + if [[ -f '/etc/init.d/mysql' ]] && (( $G_DISTRO >= 4 )); then G_DIETPI-NOTIFY 2 'Switching from /etc/init.d/mysql to mariadb.service' @@ -1212,19 +1224,19 @@ You will not face any practical differences, since both services start the same #------------------------------------------------------------------------------- #conf renaming: https://github.com/MichaIng/DietPi/pull/2312/files # - Apache - if [[ -f /etc/apache2/sites-available/owncloud.conf ]]; then + if [[ -f '/etc/apache2/sites-available/owncloud.conf' ]]; then a2dissite owncloud mv /etc/apache2/sites-available/owncloud.conf /etc/apache2/sites-available/dietpi-owncloud.conf fi - if [[ -f /etc/apache2/sites-available/nextcloud.conf ]]; then + if [[ -f '/etc/apache2/sites-available/nextcloud.conf' ]]; then a2dissite nextcloud mv /etc/apache2/sites-available/nextcloud.conf /etc/apache2/sites-available/dietpi-nextcloud.conf fi - if [[ -f /etc/apache2/sites-available/rutorrent.conf ]]; then + if [[ -f '/etc/apache2/sites-available/rutorrent.conf' ]]; then a2dissite rutorrent mv /etc/apache2/sites-available/rutorrent.conf /etc/apache2/sites-available/dietpi-rutorrent.conf @@ -1232,9 +1244,9 @@ You will not face any practical differences, since both services start the same fi # - Nginx - [[ -f /etc/nginx/sites-dietpi/owncloud.config ]] && mv /etc/nginx/sites-dietpi/owncloud.config /etc/nginx/sites-dietpi/dietpi-owncloud.conf - [[ -f /etc/nginx/sites-dietpi/nextcloud.config ]] && mv /etc/nginx/sites-dietpi/nextcloud.config /etc/nginx/sites-dietpi/dietpi-nextcloud.conf - [[ -f /etc/nginx/sites-dietpi/rutorrent.config ]] && mv /etc/nginx/sites-dietpi/rutorrent.config /etc/nginx/sites-dietpi/dietpi-rutorrent.conf + [[ -f '/etc/nginx/sites-dietpi/owncloud.config' ]] && mv /etc/nginx/sites-dietpi/owncloud.config /etc/nginx/sites-dietpi/dietpi-owncloud.conf + [[ -f '/etc/nginx/sites-dietpi/nextcloud.config' ]] && mv /etc/nginx/sites-dietpi/nextcloud.config /etc/nginx/sites-dietpi/dietpi-nextcloud.conf + [[ -f '/etc/nginx/sites-dietpi/rutorrent.config' ]] && mv /etc/nginx/sites-dietpi/rutorrent.config /etc/nginx/sites-dietpi/dietpi-rutorrent.conf # - Failsafe and custom entries for i in /etc/nginx/sites-dietpi/*.config do @@ -1274,7 +1286,7 @@ You will not face any practical differences, since both services start the same #------------------------------------------------------------------------------- #PB, fix kernel upgrades, switch from dev to stable and enable auto upgrades. - if (( $G_HW_MODEL == 44 )) && [[ ! -f /etc/armbian-release ]]; then + if (( $G_HW_MODEL == 44 )) && [[ ! -f '/etc/armbian-release' ]]; then cat << _EOF_ > /etc/armbian-release # PLEASE DO NOT EDIT THIS FILE @@ -1374,24 +1386,24 @@ Pin-Priority: -1' > /etc/apt/preferences.d/dietpi-docker_fix #------------------------------------------------------------------------------- #DietPi file renaming/removal: # - autologin.conf: https://github.com/MichaIng/DietPi/pull/2343 - [[ -f /etc/systemd/system/getty@tty1.service.d/autologin.conf ]] && mv /etc/systemd/system/getty@tty1.service.d/autologin.conf /etc/systemd/system/getty@tty1.service.d/dietpi-autologin.conf + [[ -f '/etc/systemd/system/getty@tty1.service.d/autologin.conf' ]] && mv /etc/systemd/system/getty@tty1.service.d/autologin.conf /etc/systemd/system/getty@tty1.service.d/dietpi-autologin.conf # - README.md: https://github.com/MichaIng/DietPi/pull/2341 - [[ -f /boot/README.md ]] && mv /boot/README.md /boot/dietpi-README.md + [[ -f '/boot/README.md' ]] && mv /boot/README.md /boot/dietpi-README.md # - kill-ssh-user-sessions-before-network: https://github.com/MichaIng/DietPi/pull/2357/commits/c8eb15c169cfaba69fec0b3e631e2241e0bdb7d5 systemctl disable kill-ssh-user-sessions-before-network 2> /dev/null - [[ -f /etc/systemd/system/kill-ssh-user-sessions-before-network.service ]] && rm /etc/systemd/system/kill-ssh-user-sessions-before-network.service - [[ -f /var/lib/dietpi/services/kill-ssh-user-sessions-before-network.sh ]] && rm /var/lib/dietpi/services/kill-ssh-user-sessions-before-network.sh + [[ -f '/etc/systemd/system/kill-ssh-user-sessions-before-network.service' ]] && rm /etc/systemd/system/kill-ssh-user-sessions-before-network.service + [[ -f '/var/lib/dietpi/services/kill-ssh-user-sessions-before-network.sh' ]] && rm /var/lib/dietpi/services/kill-ssh-user-sessions-before-network.sh systemctl daemon-reload systemctl enable dietpi-kill_ssh # - dietpi-unsupported_terminal.sh: https://github.com/MichaIng/DietPi/issues/2347 - [[ -f /etc/profile.d/dietpi-unsupported_terminal.sh ]] && rm /etc/profile.d/dietpi-unsupported_terminal.sh + [[ -f '/etc/profile.d/dietpi-unsupported_terminal.sh' ]] && rm /etc/profile.d/dietpi-unsupported_terminal.sh # - Possible leftover from PREP: rm -f /{DietPi,boot}/dietpi/pre-patch_file # - dietpi/conf removal from RAMdisk: https://github.com/MichaIng/DietPi/pull/2393 rm -Rf /{DietPi,boot}/dietpi/conf #------------------------------------------------------------------------------- #.dietpi-autostart_index removal, if zero: https://github.com/MichaIng/DietPi/pull/2343 - [[ -f /DietPi/dietpi/.dietpi-autostart_index ]] && (( $( /etc/apt/preferences.d/dietpi-docker_fix systemctl daemon-reload #------------------------------------------------------------------------------- #Re-enable owncloud/Nextcloud Apache configs, to fix faulty v6.19 installs: https://github.com/MichaIng/DietPi/pull/2361/commits/e33ca150cf29a4f278f5df2defc495053700a91e - [[ -f /etc/apache2/sites-available/dietpi-owncloud.conf ]] && a2ensite dietpi-owncloud - [[ -f /etc/apache2/sites-available/dietpi-nextcloud.conf ]] && a2ensite dietpi-nextcloud + [[ -f '/etc/apache2/sites-available/dietpi-owncloud.conf' ]] && a2ensite dietpi-owncloud + [[ -f '/etc/apache2/sites-available/dietpi-nextcloud.conf' ]] && a2ensite dietpi-nextcloud #------------------------------------------------------------------------------- #Clear install state for Medusa (( $G_DIETPI_INSTALL_STAGE == 2 )) && [[ ! -d $G_FP_DIETPI_USERDATA/medusa ]] && G_CONFIG_INJECT 'aSOFTWARE_INSTALL_STATE\[116\]=' 'aSOFTWARE_INSTALL_STATE[116]=0' /DietPi/dietpi/.installed @@ -1428,9 +1440,9 @@ Also have a look at "Sonarr", another alternative TV show manager, available for fi #------------------------------------------------------------------------------- #Remove obsolete flags: https://github.com/MichaIng/DietPi/pull/2398#issuecomment-452398770 - [[ -f /var/lib/dietpi/.G_RPI_UPDATE ]] && rm /var/lib/dietpi/.G_RPI_UPDATE + [[ -f '/var/lib/dietpi/.G_RPI_UPDATE' ]] && rm /var/lib/dietpi/.G_RPI_UPDATE #https://github.com/MichaIng/DietPi/pull/2407/commits/5b7ad8bddc9dd5ffe89a2614615eb936333c8d41 - [[ -f /var/lib/dietpi/.compiled_i-sabre-k2m ]] && rm /var/lib/dietpi/.compiled_i-sabre-k2m + [[ -f '/var/lib/dietpi/.compiled_i-sabre-k2m' ]] && rm /var/lib/dietpi/.compiled_i-sabre-k2m #------------------------------------------------------------------------------- #RPi changes: https://github.com/MichaIng/DietPi/pull/2402 if (( $G_HW_MODEL < 10 )); then @@ -1469,7 +1481,7 @@ Also have a look at "Sonarr", another alternative TV show manager, available for iwconfig wlan$(sed -n 2p /DietPi/dietpi/.network) power off &> /dev/null || sed -i '/^wireless-power/d' /etc/network/interfaces #------------------------------------------------------------------------------- #Grafana port change - [[ -f /etc/grafana/grafana.ini ]] && G_WHIP_MSG '[INFO]:\nGrafana port has changed to 3001 (previously 3000).' + [[ -f '/etc/grafana/grafana.ini' ]] && G_WHIP_MSG '[INFO]:\nGrafana port has changed to 3001 (previously 3000).' #------------------------------------------------------------------------------- #Remove armbian banner/profiles left on ASUS TB image rm -f /etc/profile.d/armbian-* @@ -1480,7 +1492,7 @@ Also have a look at "Sonarr", another alternative TV show manager, available for #------------------------------------------------------------------------------- #Image updates if (( $G_HW_MODEL == 40 || $G_HW_MODEL == 42 || $G_HW_MODEL == 43 )) && #$G_HW_MODEL == 42 || #Kernel panic... - [[ ! -f /etc/armbian-release ]]; then + [[ ! -f '/etc/armbian-release' ]]; then G_WHIP_MSG "[INFO]:\nThe base image for $G_HW_MODEL_DESCRIPTION has been updated.\nPlease reinstall your system with the latest image from https://dietpi.com/download.\n\nYou can continue to use this existing installation, however, some kernel features may not be available." @@ -1518,7 +1530,7 @@ Do you still want to keep "p7zip-full"?'; then fi #------------------------------------------------------------------------------- #Fix Pi-hole permissions to allow "pihole -up" - if [[ -d /var/www/html/pihole ]]; then + if [[ -d '/var/www/html/pihole' ]]; then cd /var/www/html/admin && git reset --hard HEAD cd /tmp/$G_PROGRAM_NAME @@ -1526,7 +1538,7 @@ Do you still want to keep "p7zip-full"?'; then fi #------------------------------------------------------------------------------- #WireGuard: Harden "sid" repo handling and on RPi, catch up on installing the Debian keyring: https://github.com/MichaIng/DietPi/pull/2571 - if [[ -f /etc/apt/preferences.d/dietpi-wireguard ]]; then + if [[ -f '/etc/apt/preferences.d/dietpi-wireguard' ]]; then if (( $G_HW_MODEL < 10 )); then @@ -1542,7 +1554,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Prior fi #------------------------------------------------------------------------------- #MPD: Fix permissions issue: https://github.com/MichaIng/DietPi/issues/2462 - if [[ -f /etc/mpd.conf ]]; then + if [[ -f '/etc/mpd.conf' ]]; then sed -Ei '/^(user|group)[[:blank:]]/d' /etc/mpd.conf sed -i '/^Group=/d' /lib/systemd/system/mpd.service @@ -1586,10 +1598,10 @@ _EOF_ systemctl daemon-reload #------------------------------------------------------------------------------- #Remove obsolete DietPi-Sync log: https://github.com/MichaIng/DietPi/pull/2606 - [[ -f /var/log/dietpi-sync.log ]] && rm /var/log/dietpi-sync.log + [[ -f '/var/log/dietpi-sync.log' ]] && rm /var/log/dietpi-sync.log #------------------------------------------------------------------------------- #XU4, use Meveric's xorg.conf which detects 3.x and 4.x kernel configuration requirments: - if (( $G_HW_MODEL == 11 )) && [[ -f /etc/X11/xorg.conf ]]; then + if (( $G_HW_MODEL == 11 )) && [[ -f '/etc/X11/xorg.conf' ]]; then rm /etc/X11/xorg.conf G_AGI --reinstall firmware-samsung xf86-video-armsoc-odroid malit628-odroid @@ -1597,7 +1609,7 @@ _EOF_ fi #------------------------------------------------------------------------------- #DietPi-Survey: Remove survey sent count from settings file: https://github.com/MichaIng/DietPi/pull/2626 - if [[ -f /DietPi/dietpi/.dietpi-survey ]]; then + if [[ -f '/DietPi/dietpi/.dietpi-survey' ]]; then local survey_opted_in=$(sed -n 1p /DietPi/dietpi/.dietpi-survey) echo $survey_opted_in > /DietPi/dietpi/.dietpi-survey @@ -1617,14 +1629,14 @@ _EOF_ fi #------------------------------------------------------------------------------- #Nextcloud: Add OCM/OCS provider redirects as this is checked and printed as warning on admin panel: https://github.com/MichaIng/DietPi/issues/2638 - if [[ -f /etc/apache2/sites-available/dietpi-nextcloud.conf ]] && + if [[ -f '/etc/apache2/sites-available/dietpi-nextcloud.conf' ]] && ! grep -q 'oc[ms]-provider' /etc/apache2/sites-available/dietpi-nextcloud.conf; then echo 'Redirect permanent /ocm-provider /nextcloud/ocm-provider Redirect permanent /ocs-provider /nextcloud/ocs-provider' >> /etc/apache2/sites-available/dietpi-nextcloud.conf fi - if [[ -f /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf ]] && + if [[ -f '/etc/lighttpd/conf-available/99-dietpi-nextcloud.conf' ]] && ! grep -q 'oc[ms]-provider' /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf; then echo 'url.redirect += ( @@ -1633,7 +1645,7 @@ Redirect permanent /ocs-provider /nextcloud/ocs-provider' >> /etc/apache2/sites- )' >> /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf fi - if [[ -f /etc/nginx/sites-dietpi/dietpi-nextcloud.conf ]] && + if [[ -f '/etc/nginx/sites-dietpi/dietpi-nextcloud.conf' ]] && ! grep -q 'oc[ms]-provider' /etc/nginx/sites-dietpi/dietpi-nextcloud.conf; then echo 'location ~ ^\/(?:ocm-provider|ocs-provider).* { @@ -1692,6 +1704,237 @@ NB: When accessing "deluge-console" you need to do that as user "debian-deluged" fi #------------------------------------------------------------------------------- + elif (( $G_DIETPI_VERSION_SUB == 22 )); then + + #------------------------------------------------------------------------------- + # Apply Serial/UART rework: https://github.com/MichaIng/DietPi/pull/2678 + # - Cleanup: Remove serial-getty masks for all non-existent serial devices + for i in /etc/systemd/system/serial-getty@tty{S,AMA,SAC}[0-9].service + do + + [[ -L $i && $(readlink $i) == '/dev/null' ]] || continue + local tty=${i##*serial-getty@} + tty=${tty%.service} + [[ -e /dev/$tty ]] || systemctl unmask serial-getty@$tty + + done + # - Fix: Disable serial-getty instances for all non-existent serial devices + for i in /etc/systemd/system/getty.target.wants/serial-getty@tty{S,AMA,SAC}[0-9].service + do + + [[ -L $i ]] || continue + local tty=${i##*serial-getty@} + tty=${tty%.service} + [[ -e /dev/$tty ]] || systemctl disable serial-getty@$tty + + done + #------------------------------------------------------------------------------- + # Patch proxy settings changes: https://github.com/MichaIng/DietPi/pull/2716 + sed -i '/^[[:blank:]]*CONFIG_PROXY_ENABLED=/d' /DietPi/dietpi.txt + local proxy='' + if proxy=$(grep '^[[:blank:]]*export {http,https,ftp}_proxy=' /etc/bash.bashrc); then + + [[ -f '/etc/bashrc.d/dietpi-proxy.sh' ]] || echo "$proxy" > /etc/bashrc.d/dietpi-proxy.sh + sed -i '/^[[:blank:]]*export {http,https,ftp}_proxy=/d' /etc/bash.bashrc + + fi + #------------------------------------------------------------------------------- + # dietpi-set_dphys-swapfile renamed to: "dietpi-set_swapfile": https://github.com/MichaIng/DietPi/pull/2720 + rm -f /{DietPi,boot}/dietpi/func/dietpi-set_dphys-swapfile + #------------------------------------------------------------------------------- + if (( $G_DIETPI_INSTALL_STAGE == 2 )); then + + # Infom Sonarr/Radarr/Lidarr users about DietPi-Arr_to_RAM: https://github.com/MichaIng/DietPi/pull/2698 + # - Skip on Jessie: https://github.com/MichaIng/DietPi/issues/2689#issuecomment-487306241 + if (( $G_DISTRO > 3 )) && grep -qE '^aSOFTWARE_INSTALL_STATE\[(106|144|145)\]=2' /DietPi/dietpi/.installed; then + + G_WHIP_MSG 'DietPi-Arr_to_RAM | Link Sonarr/Radarr/Lidarr database files to RAM\n +With v6.18 we silently added a new script that allows linking Sonarr/Radarr/Lidarr database files to RAM, increasing access performance, reducing disk I/O and avoiding constant external HDD spinning due to the very regular access to these files.\n +This script has gone through some rework and polishing with v6.23 and can now be enabled to automatically link those databases to RAM on boot and store them back to disk on shutdown.\n +Further info and usage: https://dietpi.com/phpbb/viewtopic.php?f=8&t=5828' + + fi + #----------------------------------------------------------------------- + # Fix IPv6 connections with WireGuard: https://github.com/MichaIng/DietPi/issues/2691 + if [[ -f '/etc/wireguard/wg0.conf' ]] && ! grep -q 'sysctl' /etc/wireguard/wg0.conf; then + + [[ -f '/etc/sysctl.d/dietpi-wireguard.conf' ]] && rm /etc/sysctl.d/dietpi-wireguard.conf + sed -i '/^ListenPort/a\PostUp = sysctl net.ipv4.conf.%i.forwarding=1 net.ipv4.conf.$(sed -n 3p /DietPi/dietpi/.network).forwarding=1' /etc/wireguard/wg0.conf + sed -i '/^ListenPort/a\PostUp = sysctl net.ipv6.conf.$(sed -n 3p /DietPi/dietpi/.network).accept_ra=2' /etc/wireguard/wg0.conf + sed -i '/^ListenPort/a\PostUp = sysctl net.ipv6.conf.%i.forwarding=1 net.ipv6.conf.$(sed -n 3p /DietPi/dietpi/.network).forwarding=1' /etc/wireguard/wg0.conf + sed -i '/^ListenPort/a\PostUp = ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o $(sed -n 3p /DietPi/dietpi/.network) -j MASQUERADE' /etc/wireguard/wg0.conf + sed -i '/^ListenPort/a\PostDown = ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o $(sed -n 3p /DietPi/dietpi/.network) -j MASQUERADE' /etc/wireguard/wg0.conf + + fi + #----------------------------------------------------------------------- + # NordVPN: Tiny fix for doubled auth-user-pass entry: https://github.com/MichaIng/DietPi/commit/847a016638c6929153dc16e7ce054d3dce5e4c60 + if [[ -f '/var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn/settings_dietpi.conf' ]]; then + + . /var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn/settings_dietpi.conf + if [[ -f /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER && $(grep -c '^auth-user-pass' /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER) == 2 ]]; then + + sed -i '/^auth-user-pass$/d' /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER + + fi + unset NORDVPN_USERNAME NORDVPN_PASSWORD NORDVPN_SERVER PROTOCOL + + fi + #----------------------------------------------------------------------- + # PHP7.3 migration: https://github.com/MichaIng/DietPi/issues/2367 + local reinstall_ids='' + local upgrade_php=0 + if grep -q '^aSOFTWARE_INSTALL_STATE\[89\]=2' /DietPi/dietpi/.installed; then + + # ownCloud (up to v10.2) does not yet support PHP7.3, so install PHP7.2 for now + local PHP_NAME='php7.3' + [[ -f '/var/www/owncloud/occ' ]] && PHP_NAME='php7.2' + + if ! command -v $PHP_NAME &> /dev/null; then + + reinstall_ids+=' 89' + G_WHIP_MSG "[ INFO ] PHP upgrade\n +Your PHP instance will be upgraded to ${PHP_NAME^^}. This enhances security and performance of your web applications and is required to run some of the latest web application versions, e.g. Nextcloud 16, ownCloud 10.2 and others.\n +We will update webserver configurations and backup the whole /etc/php(5) directory to /mnt/dietpi_userdata/php(5)_bak, so you can recover custom settings.\n +NB: You must update all manually (outside of DietPi-Software) installed PHP-dependent web applications which do not use the dedicated webserver, to use the new ${PHP_NAME^^} socket/instance. +NBB: Reinstall manually installed PHP modules via: G_AGI $PHP_NAME-" + upgrade_php=1 + + # We need to upgrade Jessie Nextcloud users since NC13 does not support PHP7.3 yet. Check for NC < 14 in general and do incremental upgrading in case. + local upgrade_nextcloud=0 + while [[ -f '/var/www/nextcloud/version.php' ]] + do + + # - Estimate Nextcloud version, skip if higher than 13 or invalid + local nextcloud_version=$(grep '$OC_VersionString' /var/www/nextcloud/version.php | sed "s/^.*= '//" | sed 's/\..*$//g') + disable_error=1 G_CHECK_VALIDINT "$nextcloud_version" 9 13 || break + + # - Inform user + G_WHIP_MSG '[ INFO ] Nextcloud will be upgraded\n +Your Nextcloud version does not yet support PHP7.3. On Jessie systems this is expected where Nextcloud 14+ was not supported.\n +We will upgrade your Nextcloud version to Nextcloud 14 now to allow the PHP upgrade, which on the other hand enables you to further upgrade Nextcloud to its current major version.\n +We will create a full backup of your Nextcloud install directory and database to: /mnt/dietpi_userdata/nextcloud_data/ +Your Nextcloud data are not touched.' + upgrade_nextcloud=1 + + # - Backup database and install dir: Use our cloud migration script + # In case of failure, exit to not create any damage + local GITOWNER=$(grep -m1 '^[[:blank:]]*DEV_GITOWNER=' /DietPi/dietpi.txt | sed 's/^[^=]*=//'); GITOWNER=${GITOWNER:-MichaIng} + local GITBRANCH=$(grep -m1 '^[[:blank:]]*DEV_GITBRANCH=' /DietPi/dietpi.txt | sed 's/^[^=]*=//'); GITBRANCH=${GITBRANCH:-master} + local url="https://raw.githubusercontent.com/$GITOWNER/DietPi/$GITBRANCH/.meta/dietpi-cloud-migration" + G_CHECK_URL "$url" + curl -sSL "$url" | bash + G_ERROR_HANDLER_EXITCODE=$? + G_ERROR_HANDLER_COMMAND='Nextcloud backup' + G_ERROR_HANDLER_RETRY=0 + G_ERROR_HANDLER + + # - Incremental upgrade since skipping major versions is not supported. There should be no installs < NC13 but let's be failsafe. + until (( $nextcloud_version > 13 )) + do + + ((nextcloud_version++)) + G_CHECK_URL https://download.nextcloud.com/server/releases/latest-$nextcloud_version.tar.bz2 + G_RUN_CMD wget https://download.nextcloud.com/server/releases/latest-$nextcloud_version.tar.bz2 + G_RUN_CMD rm -R /var/www/nextcloud + G_RUN_CMD tar xf latest-$nextcloud_version.tar.bz2 -C /var/www + G_RUN_CMD cp -a /mnt/dietpi_userdata/nextcloud_data/dietpi-nextcloud-installation-backup/config/config.php /var/www/nextcloud/config/config.php + # - Restore custom apps but prevent overwriting upgraded ones or adding obsolete files + for i in /mnt/dietpi_userdata/nextcloud_data/dietpi-nextcloud-installation-backup/apps/* + do + + [[ -d /var/www/nextcloud/apps/${i##*/} ]] || G_RUN_CMD cp -a $i /var/www/nextcloud/apps/ + + done + # - Permissions + G_RUN_CMD chown -R www-data:www-data /var/www/nextcloud + G_RUN_CMD find /var/www/nextcloud/ -type d -exec chmod 750 {} \; + G_RUN_CMD find /var/www/nextcloud/ -type f -exec chmod 640 {} \; + # - Upgrade until NC13, then upgrade after PHP7.3 has been installed, since NC13 does not support PHP5.6 anymore + (( $nextcloud_version < 14 )) && { ncc upgrade || exit 1; } + + done + break + + done + + [[ -d '/etc/php' ]] && G_RUN_CMD cp -a /etc/php /mnt/dietpi_userdata/php_bak + [[ -d '/etc/php5' ]] && G_RUN_CMD cp -a /etc/php5 /mnt/dietpi_userdata/php5_bak + + # - Lighttpd + [[ -f '/etc/lighttpd/conf-available/15-fastcgi-php.conf' ]] && sed -i "s@\"socket\".*\$@\"socket\" => \"/run/php/$PHP_NAME-fpm.sock\",@" /etc/lighttpd/conf-available/15-fastcgi-php.conf + # - Nginx + [[ -f '/etc/nginx/nginx.conf' ]] && sed -i "s#/run/php.*-fpm.sock#/run/php/$PHP_NAME-fpm.sock#g" /etc/nginx/nginx.conf + + fi + + fi + #----------------------------------------------------------------------- + # Re-create /etc/sysctl.d/99-sysctl.conf -> ../sysctl.conf symlink if not existent: https://github.com/MichaIng/DietPi/issues/2505 + if [[ ! -L '/etc/sysctl.d/99-sysctl.conf' ]]; then + + [[ -e '/etc/sysctl.d/99-sysctl.conf' ]] && mv /etc/sysctl.d/99-sysctl.conf /etc/sysctl.conf + ln -sf ../sysctl.conf /etc/sysctl.d/99-sysctl.conf + + fi + #----------------------------------------------------------------------- + # Reinstalls + # Subsonic: https://github.com/MichaIng/DietPi/pull/2705 + [[ -L '/var/subsonic/transcode' ]] && rm /var/subsonic/transcode + # Plex Media Server: https://github.com/MichaIng/DietPi/pull/2722 + dpkg-query -s plexmediaserver-installer &> /dev/null && dpkg -r plexmediaserver-installer + [[ -f '/etc/apt/sources.list.d/plex.list' ]] && rm /etc/apt/sources.list.d/plex.list + # Logitech Media Server: https://github.com/MichaIng/DietPi/commit/eccef6700381c3f044ec4d435beb167736db0bb4 + if [[ -f '/etc/systemd/system/squeezeboxserver.service' ]]; then + + systemctl disable squeezeboxserver + mv /etc/systemd/system/squeezeboxserver.service /etc/systemd/system/logitechmediaserver.service + + fi + /DietPi/dietpi/dietpi-software reinstall 34 35 42 $reinstall_ids + #----------------------------------------------------------------------- + # Remove old PHP version + if (( $upgrade_php )); then + + G_AGP php{5,7.0,7.1}-* libapache2-mod-php{5,7.0,7.1} + [[ $PHP_NAME = 'php7.3' ]] && G_AGP php7.2-* libapache2-mod-php7.2 + # New mod-php must be enabled manually since this is skipped by APT as long as prior version is active + command -v a2enmod &> /dev/null && a2enmod $PHP_NAME + + # Recover ownCloud, Nextcloud and Pydio PHP modules + if grep -q '^aSOFTWARE_INSTALL_STATE\[47\]=2' /DietPi/dietpi/.installed; then + + G_AGI $PHP_NAME-intl + echo -e '; ownCloud PHP settngs\n; priority=99\napc.enable_cli=1' > /etc/php/${PHP_NAME#php}/mods-available/dietpi-owncloud.ini + phpenmod dietpi-owncloud + + fi + if grep -q '^aSOFTWARE_INSTALL_STATE\[114\]=2' /DietPi/dietpi/.installed; then + + G_AGI $PHP_NAME-intl + echo -e '; Nextcloud PHP settngs\n; priority=99\napc.enable_cli=1\nopcache.enable=1 +opcache.enable_cli=1\nopcache.interned_strings_buffer=8\nopcache.max_accelerated_files=10000 +opcache.memory_consumption=128\nopcache.save_comments=1\nopcache.revalidate_freq=1' > /etc/php/${PHP_NAME#php}/mods-available/dietpi-nextcloud.ini + phpenmod dietpi-nextcloud + + fi + grep -q '^aSOFTWARE_INSTALL_STATE\[48\]=2' /DietPi/dietpi/.installed && G_AGI $PHP_NAME-intl + + # Upgrade Nextcloud + if (( $upgrade_nextcloud )); then + + local mariadb='mariadb'; (( $G_DISTRO < 4 )) && mariadb='mysql' + G_RUN_CMD systemctl start $mariadb redis-server + ncc upgrade + ncc db:add-missing-indices + ncc db:convert-filecache-bigint + + fi + + fi + + fi + #------------------------------------------------------------------------------- + fi #------------------------------------------------------------------------------- diff --git a/dietpi/pre-patch_file b/dietpi/pre-patch_file index 30f092fe95..f0ed8ac6c4 100644 --- a/dietpi/pre-patch_file +++ b/dietpi/pre-patch_file @@ -9,10 +9,10 @@ #//////////////////////////////////// # # Info: - # - Online pre-patching for client system for changes made to update system and critical bug fixes + # - Patches changes made to update system, critical bug fixes and changes that need to be applied before APT and patch_file to run without error # - Runs from dietpi-update as very first update step # - In case of failure, returns related pre-patch ID as exit code - # - NB: Keep this script as simple as possible, do not load/call dietpi-globals, to allow fixing most kinds of DietPi code issues! + # - NB: Keep this script as simple as possible, do not load/call dietpi-globals, to allow adjusting/fixing most kinds of DietPi code first! # # Usage: # - ./pre-patch_file $G_DIETPI_VERSION_SUB @@ -22,7 +22,7 @@ echo -e '\n \e[38;5;154mDietPi-Pre-patch\e[0m \e[90m───────────────────────────────────────────────────── - Mode: \e[0mApplying critical pre-patches\n' + Mode: \e[0mApplying pre-patches\n' # Grab input, being failsafe when applying to $G_DIETPI_VERSION_SUB if [[ $1 =~ ^-?[0-9]+$ ]]; then @@ -40,51 +40,104 @@ # Main loop #/////////////////////////////////////////////////////////////////////////////// - while (( $EXIT_CODE == 0 )) + until (( $EXIT_CODE )) do #------------------------------------------------------------------------------- # Pre-patch 1: RAMlog 0 free space check due to issues with failing DietPi cron jobs in v6.11 if (( $G_DIETPI_VERSION_SUB < 12 && $(df -B1M --output=avail /var/log | sed -n 2p) < 2 )); then - echo -e '\e[90m[\e[0m \e[33mWARN\e[0m \e[90m]\e[0m Pre-patch 1 | Clearing /var/log files to free up RAMlog space (<2MB) before update will continue' + echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 1 | Clearing /var/log files to free up RAMlog space (<2MB) before update will continue' /DietPi/dietpi/func/dietpi-logclear 1 || { EXIT_CODE=1; break; } fi #------------------------------------------------------------------------------- # Pre-patch 2: https://github.com/MichaIng/DietPi/pull/2490 - if (( $G_DIETPI_VERSION_SUB < 21 )) && [[ -f /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf ]] && + if (( $G_DIETPI_VERSION_SUB < 21 )) && [[ -f '/etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf' ]] && grep -qi 'buster' /etc/os-release; then - echo -e '\e[90m[\e[0m \e[33mWARN\e[0m \e[90m]\e[0m Pre-patch 2 | Patching /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf for MariaDB v10.3/Buster support' + echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 2 | Patching /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf for MariaDB v10.3/Buster support' sed -i '/innodb_large_prefix/d' /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf || { EXIT_CODE=2; break; } sed -i '/innodb_file_format/d' /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf || { EXIT_CODE=2; break; } fi #------------------------------------------------------------------------------- # Pre-patch 3: https://github.com/MichaIng/DietPi/issues/2213 + if (( $G_DIETPI_VERSION_SUB < 22 )) && + GLOBAL_PW=$(openssl enc -d -a -aes-256-cbc -nosalt -pass pass:'DietPiRocks!' -in /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin 2> /dev/null); then + + echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 3 | Storing global DietPi-Software password with enhanced security' + grep -qi 'buster' /etc/os-release && pbkdf2='-iter 10000' || pbkdf2='' + openssl enc -e -a -md sha256 -aes-256-cbc $pbkdf2 -salt -pass pass:'DietPiRocks!' -out /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin <<< $GLOBAL_PW || { EXIT_CODE=3; break; } + + fi + #------------------------------------------------------------------------------- # Pre-patch 4: https://github.com/MichaIng/DietPi/issues/2656 - if (( $G_DIETPI_VERSION_SUB < 22 )); then + # Pre-patch 5: Add new G_CHECK_URL dietpi.txt settings + if (( $G_DIETPI_VERSION_SUB < 23 )); then - if GLOBAL_PW=$(openssl enc -d -a -aes-256-cbc -nosalt -pass pass:'DietPiRocks!' -in /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin 2> /dev/null); then + if [[ -f '/etc/apt/preferences.d/dietpi-wireguard' ]]; then - echo -e '\e[90m[\e[0m \e[33mWARN\e[0m \e[90m]\e[0m Pre-patch 3 | Storing global DietPi-Software password with enhanced security' - grep -qi 'buster' /etc/os-release && pbkdf2='-iter 10000' || pbkdf2='' - openssl enc -e -a -md sha256 -aes-256-cbc $pbkdf2 -salt -pass pass:'DietPiRocks!' -out /var/lib/dietpi/dietpi-software/.GLOBAL_PW.bin <<< $GLOBAL_PW || { EXIT_CODE=3; break; } + echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 4 | Hardening Debian Sid repo usage to prevent accidental distro upgrades but allow auto-upgrades for WireGuard packages' + echo -e 'Package: *\nPin: release n=sid\nPin-Priority: -1\n +Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Priority: 100' > /etc/apt/preferences.d/dietpi-wireguard || { EXIT_CODE=4; break; } fi - if [[ -f /etc/apt/preferences.d/dietpi-wireguard ]]; then - echo -e '\e[90m[\e[0m \e[33mWARN\e[0m \e[90m]\e[0m Pre-patch 4 | Hardening Debian Sid repo usage to prevent accidental distro upgrades' - echo -e 'Package: *\nPin: release n=sid\nPin-Priority: -1\n -Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=sid\nPin-Priority: 99' > /etc/apt/preferences.d/dietpi-wireguard || { EXIT_CODE=4; break; } + grep -q 'CONFIG_G_CHECK_URL_TIMEOUT' /DietPi/dietpi.txt || echo 'CONFIG_G_CHECK_URL_TIMEOUT=5' >> /DietPi/dietpi.txt || { EXIT_CODE=5; break; } + grep -q 'CONFIG_G_CHECK_URL_ATTEMPTS' /DietPi/dietpi.txt || echo 'CONFIG_G_CHECK_URL_ATTEMPTS=3' >> /DietPi/dietpi.txt || { EXIT_CODE=5; break; } + + fi + #------------------------------------------------------------------------------- + # Pre-patch 6: Move Jessie systems to "jessie-support" branch: https://github.com/MichaIng/DietPi/issues/2332 + # Pre-patch 7: https://github.com/MichaIng/DietPi/pull/2728 + if grep -qi 'jessie' /etc/os-release; then + + if ! grep -q '^[[:blank:]]*DEV_GITBRANCH=jessie-support' /DietPi/dietpi.txt; then + + echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 7 | Migrating Jessie systems to "jessie-support" update branch' + if grep -q '^[[:blank:]]*DEV_GITBRANCH=' /DietPi/dietpi.txt; then + + sed -i '/^[[:blank:]]*DEV_GITBRANCH=/c\DEV_GITBRANCH=jessie-support' /DietPi/dietpi.txt + + else + + echo 'DEV_GITBRANCH=jessie-support' >> /DietPi/dietpi.txt + + fi + + # Remove DietPi-Update working directory to allow concurrent execution. + cd /tmp + [[ -d '/tmp/DietPi-Update' ]] && rm -R /tmp/DietPi-Update + + # Apply update forcefully, since user has already chosen to do so. + /DietPi/dietpi/dietpi-update 1 + + # Kill parental dietpi-update instance and exit this script to avoid deprecated update finish. + kill $PPID + exit + + fi + + if (( $G_DIETPI_VERSION_SUB < 23 && $(sed -n 1p /DietPi/dietpi/.hw_model) > 9 )); then + + echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 7 | Applying changes to APT sources.list since Debian dropped support for Jessie systems' + if [[ $(uname -m) == 'aarch64' ]]; then + + echo 'deb http://archive.debian.org/debian/ main contrib non-free' > /etc/apt/sources.list || { EXIT_CODE=7; break; } + + else + + sed -Ei '/jessie-(backports|updates)/d' /etc/apt/sources.list || { EXIT_CODE=7; break; } + + fi fi fi #------------------------------------------------------------------------------- # Finished - echo -e '\e[90m[\e[0m \e[32mOK\e[0m \e[90m]\e[0m Successfully applied critical pre-patches\n' + echo -e '\e[90m[\e[0m \e[32mOK\e[0m \e[90m]\e[0m Successfully applied pre-patches\n' break #------------------------------------------------------------------------------- diff --git a/dietpi/preboot b/dietpi/preboot index 718a35db10..4c401ff52e 100644 --- a/dietpi/preboot +++ b/dietpi/preboot @@ -83,7 +83,7 @@ # Automation #---------------------------------------------------------------- # - Generate Swapfile - /DietPi/dietpi/func/dietpi-set_dphys-swapfile $(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') "$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=' /DietPi/dietpi.txt | sed 's/^[^=]*=//')" + /DietPi/dietpi/func/dietpi-set_swapfile $(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') "$(grep -m1 '^[[:blank:]]*AUTO_SETUP_SWAPFILE_LOCATION=' /DietPi/dietpi.txt | sed 's/^[^=]*=//')" # - Apply Timezone local autoinstall_timezone=$(grep -m1 '^[[:blank:]]*AUTO_SETUP_TIMEZONE=' /DietPi/dietpi.txt | sed 's/^[^=]*=//') diff --git a/dietpi/server_version-6 b/dietpi/server_version-6 index 467a39c6e9..3a79d15d01 100644 --- a/dietpi/server_version-6 +++ b/dietpi/server_version-6 @@ -1,3 +1,3 @@ 6 -22 -3 +23 +0 diff --git a/rootfs/etc/bashrc.d/dietpi.bash b/rootfs/etc/bashrc.d/dietpi.bash index bfdcb905bb..b71dd589f1 100644 --- a/rootfs/etc/bashrc.d/dietpi.bash +++ b/rootfs/etc/bashrc.d/dietpi.bash @@ -15,7 +15,7 @@ #//////////////////////////////////// # - DietPi-Globals: dietpi-* aliases, G_* functions and variables - . /DietPi/dietpi/func/dietpi-globals + . /DietPi/dietpi/func/dietpi-globals || { echo -e '[\e[31mFAILED\e[0m] DietPi-Login | DietPi boot scripts failed. Skipping DietPi login scripts...'; exit 1; } # - "G_DIETPI-NOFITY -2 message" starts a process animation. # If scripts fail to kill the animation, e.g. cancelled by user, terminal bash prompt has to do it as last resort: @@ -53,8 +53,7 @@ As a workaround we fooled the server by setting: TERM=$TERM. This is not the cleanest solution, since commands might expect colours or formats, that are not supported by the actual terminal.\n Please change your SSH clients terminal, respectively the passed \$TERM string$ncurses_term." && (( $G_WHIP_RETURNED_VALUE )) && G_AGI ncurses-term - unset TERM_old - unset ncurses_term + unset TERM_old ncurses_term fi diff --git a/rootfs/etc/cron.daily/dietpi b/rootfs/etc/cron.daily/dietpi index 532e7745fa..85aa1213dc 100644 --- a/rootfs/etc/cron.daily/dietpi +++ b/rootfs/etc/cron.daily/dietpi @@ -13,20 +13,20 @@ #---------------------------------------------------------------- # Main Loop #---------------------------------------------------------------- - #Time sync update, if mode 2 (daily) is detected + # Time sync update, if mode 2 (daily) is detected if grep -qi '^[[:blank:]]*CONFIG_NTP_MODE=2' /DietPi/dietpi.txt; then /DietPi/dietpi/func/run_ntpd 1 &> /dev/null & fi #---------------------------------------------------------------- - #Check/Update DietPi + # Check/Update DietPi if grep -qi '^[[:blank:]]*CONFIG_CHECK_DIETPI_UPDATES=1' /DietPi/dietpi.txt; then # - Check and update if grep -qi '^[[:blank:]]*CONFIG_AUTO_DIETPI_UPDATES=1' /DietPi/dietpi.txt; then - /DietPi/dietpi/dietpi-update 1 + /DietPi/dietpi/dietpi-update 1 &> /dev/null # - Check only else @@ -37,12 +37,18 @@ fi #---------------------------------------------------------------- - #DietPi-Sync daily - if [[ -f /DietPi/dietpi/.dietpi-sync_settings ]] && - grep -qi 'SYNC_CRONDAILY=1' /DietPi/dietpi/.dietpi-sync_settings; then + # DietPi-Sync daily + if [[ -f '/DietPi/dietpi/.dietpi-sync_settings' ]] && grep -q 'SYNC_CRONDAILY=1' /DietPi/dietpi/.dietpi-sync_settings; then /DietPi/dietpi/dietpi-sync 1 &> /dev/null & + fi + #---------------------------------------------------------------- + # Refresh DietPi MOTD + if [[ -f '/DietPi/dietpi/.dietpi-banner' ]] && grep -q 'aENABLED[12]=1' /DietPi/dietpi/.dietpi-banner; then + + curl -sL https://dietpi.com/motd > /tmp/.dietpi_motd & + fi #---------------------------------------------------------------- exit diff --git a/rootfs/etc/systemd/system/dietpi-boot.service b/rootfs/etc/systemd/system/dietpi-boot.service index e90a1b3bb5..652928c9fa 100644 --- a/rootfs/etc/systemd/system/dietpi-boot.service +++ b/rootfs/etc/systemd/system/dietpi-boot.service @@ -1,15 +1,15 @@ [Unit] Description=DietPi-Boot # Order 3 -Requires=dietpi-preboot.service -After=dietpi-preboot.service network.target networking.service +Requisite=dietpi-preboot.service +After=dietpi-preboot.service network.target Before=getty-pre.target getty@tty1.service getty.target ssh.service dropbear.service [Service] Type=oneshot RemainAfterExit=yes StandardOutput=tty -ExecStart=/bin/bash -c '/DietPi/dietpi/boot 2>&1 | tee /tmp/dietpi-boot.log' +ExecStart=/bin/dash -c '/DietPi/dietpi/boot 2>&1 | tee /tmp/dietpi-boot.log' [Install] WantedBy=multi-user.target diff --git a/rootfs/etc/systemd/system/dietpi-fs_partition_resize.service b/rootfs/etc/systemd/system/dietpi-fs_partition_resize.service index 74830cb128..af4a8dee69 100644 --- a/rootfs/etc/systemd/system/dietpi-fs_partition_resize.service +++ b/rootfs/etc/systemd/system/dietpi-fs_partition_resize.service @@ -10,7 +10,7 @@ Before=var-swap.swap swap.target local-fs-pre.target Type=oneshot StandardOutput=tty ExecStartPre=/bin/mkdir -p /var/tmp/dietpi/logs -ExecStart=/bin/bash -c '/var/lib/dietpi/services/fs_partition_resize.sh 2>&1 | tee /var/tmp/dietpi/logs/fs_partition_resize.log' +ExecStart=/bin/dash -c '/var/lib/dietpi/services/fs_partition_resize.sh 2>&1 | tee /var/tmp/dietpi/logs/fs_partition_resize.log' [Install] WantedBy=local-fs.target diff --git a/rootfs/etc/systemd/system/dietpi-postboot.service b/rootfs/etc/systemd/system/dietpi-postboot.service index 204dc67008..9cade037fb 100644 --- a/rootfs/etc/systemd/system/dietpi-postboot.service +++ b/rootfs/etc/systemd/system/dietpi-postboot.service @@ -1,7 +1,7 @@ [Unit] Description=DietPi-PostBoot # Order 4 -Requires=dietpi-boot.service +Requisite=dietpi-boot.service After=dietpi-boot.service [Service] diff --git a/rootfs/etc/systemd/system/dietpi-preboot.service b/rootfs/etc/systemd/system/dietpi-preboot.service index 7421b66bb6..a31023035c 100644 --- a/rootfs/etc/systemd/system/dietpi-preboot.service +++ b/rootfs/etc/systemd/system/dietpi-preboot.service @@ -1,16 +1,16 @@ [Unit] Description=DietPi-PreBoot # Order 2 -Requires=dietpi-ramdisk.service +Requisite=dietpi-ramdisk.service Wants=network-pre.target After=dietpi-ramdisk.service dietpi-ramlog.service -Before=network-pre.target dropbear.service ssh.service +Before=network-pre.target [Service] Type=oneshot RemainAfterExit=yes StandardOutput=tty -ExecStart=/bin/bash -c '/DietPi/dietpi/preboot 2>&1 | tee /tmp/dietpi-preboot.log' +ExecStart=/bin/dash -c '/DietPi/dietpi/preboot 2>&1 | tee /tmp/dietpi-preboot.log' [Install] -WantedBy=local-fs.target +WantedBy=multi-user.target diff --git a/rootfs/etc/systemd/system/dietpi-ramdisk.service b/rootfs/etc/systemd/system/dietpi-ramdisk.service index 541c342f30..88769bc211 100644 --- a/rootfs/etc/systemd/system/dietpi-ramdisk.service +++ b/rootfs/etc/systemd/system/dietpi-ramdisk.service @@ -5,11 +5,11 @@ After=local-fs.target DietPi.mount boot.mount -.mount Before=syslog.service rsyslog.service [Service] -Type=forking +Type=oneshot RemainAfterExit=yes ExecStartPre=/bin/mkdir -p /var/tmp/dietpi/logs -ExecStart=/bin/bash -c '/boot/dietpi/func/dietpi-ramdisk 0 &>> /var/tmp/dietpi/logs/dietpi-ramdisk.log' -ExecStop=/bin/bash -c '/DietPi/dietpi/func/dietpi-ramdisk 1 &>> /var/tmp/dietpi/logs/dietpi-ramdisk.log' +ExecStart=/bin/dash -c '/boot/dietpi/func/dietpi-ramdisk 0 2>&1 >> /var/tmp/dietpi/logs/dietpi-ramdisk.log' +ExecStop=/bin/dash -c '/DietPi/dietpi/func/dietpi-ramdisk 1 2>&1 >> /var/tmp/dietpi/logs/dietpi-ramdisk.log' [Install] -WantedBy=local-fs.target +WantedBy=multi-user.target diff --git a/rootfs/etc/systemd/system/dietpi-ramlog.service b/rootfs/etc/systemd/system/dietpi-ramlog.service index 3c4dcb4fe1..bdeaff9669 100644 --- a/rootfs/etc/systemd/system/dietpi-ramlog.service +++ b/rootfs/etc/systemd/system/dietpi-ramlog.service @@ -5,11 +5,11 @@ After=local-fs.target DietPi.mount var-log.mount -.mount Before=syslog.service rsyslog.service [Service] -Type=forking +Type=oneshot RemainAfterExit=yes ExecStartPre=/bin/mkdir -p /var/tmp/dietpi/logs -ExecStart=/bin/bash -c '/boot/dietpi/func/dietpi-ramlog 0 &>> /var/tmp/dietpi/logs/dietpi-ramlog.log' -ExecStop=/bin/bash -c '/DietPi/dietpi/func/dietpi-ramlog 1 &>> /var/tmp/dietpi/logs/dietpi-ramlog.log' +ExecStart=/bin/dash -c '/boot/dietpi/func/dietpi-ramlog 0 2>&1 >> /var/tmp/dietpi/logs/dietpi-ramlog.log' +ExecStop=/bin/dash -c '/DietPi/dietpi/func/dietpi-ramlog 1 2>&1 >> /var/tmp/dietpi/logs/dietpi-ramlog.log' [Install] -WantedBy=local-fs.target +WantedBy=multi-user.target diff --git a/rootfs/etc/systemd/system/dietpi-wifi-monitor.service b/rootfs/etc/systemd/system/dietpi-wifi-monitor.service index 1cba3633d0..9525341f79 100644 --- a/rootfs/etc/systemd/system/dietpi-wifi-monitor.service +++ b/rootfs/etc/systemd/system/dietpi-wifi-monitor.service @@ -1,13 +1,13 @@ # Monitors loss of WiFi connection and automatically reconnects [Unit] Description=DietPi-WiFi-Monitor -Requires=dietpi-ramdisk.service +Requisite=dietpi-ramdisk.service Wants=network-online.target After=dietpi-boot.service network-online.target network.target [Service] ExecStartPre=/DietPi/dietpi/func/obtain_network_details -ExecStartPre=/bin/bash -c '[[ -e /sys/class/net/wlan$(sed -n 2p /DietPi/dietpi/.network) ]]' +ExecStartPre=/bin/dash -c '[ -e /sys/class/net/wlan$(sed -n 2p /DietPi/dietpi/.network) ]' ExecStart=/var/lib/dietpi/services/dietpi-wifi-monitor.sh [Install] diff --git a/rootfs/var/lib/dietpi/services/dietpi-wifi-monitor.sh b/rootfs/var/lib/dietpi/services/dietpi-wifi-monitor.sh index c950605f1a..bdf0f54b0b 100644 --- a/rootfs/var/lib/dietpi/services/dietpi-wifi-monitor.sh +++ b/rootfs/var/lib/dietpi/services/dietpi-wifi-monitor.sh @@ -1,23 +1,21 @@ #!/bin/bash { - #Import DietPi-Globals --------------------------------------------------------------- - . /DietPi/dietpi/func/dietpi-globals - G_PROGRAM_NAME='DietPi-WiFi-Monitor' - G_CHECK_ROOT_USER - G_CHECK_ROOTFS_RW - G_INIT - #Import DietPi-Globals --------------------------------------------------------------- - - #Update network info + # Check for root permissions + (( $UID )) && { echo 'ERROR: Root permissions required. Please run this script with "sudo". Exiting...'; exit 1; } + + # Check for concurrent execution + pgrep -f 'dietpi-wifi-monitor.sh' &> /dev/null && { echo 'ERROR: Concurrent execution detected. Please exit the running instance of DietPi-WiFi-Monitor first. Exiting...'; exit 1; } + + # Update network info /DietPi/dietpi/func/obtain_network_details URL_PING='' ADAPTER="wlan$(sed -n 2p /DietPi/dietpi/.network)" - TICKRATE=10 + TICKRATE={TICKRATE:-10} #------------------------------------------------------------------------------------- - #Main + # Main #------------------------------------------------------------------------------------- # Check for valid WiFi adapter [[ -e /sys/class/net/$ADAPTER ]] || { echo "ERROR: No valid WiFi adapter found on interface: $ADAPTER. Exiting..."; exit 1; } diff --git a/rootfs/var/lib/dietpi/services/fs_partition_resize.sh b/rootfs/var/lib/dietpi/services/fs_partition_resize.sh index b0b1749c9f..9c97873159 100644 --- a/rootfs/var/lib/dietpi/services/fs_partition_resize.sh +++ b/rootfs/var/lib/dietpi/services/fs_partition_resize.sh @@ -1,54 +1,60 @@ #!/bin/bash +{ + # Disable this service + systemctl disable dietpi-fs_partition_resize -systemctl disable dietpi-fs_partition_resize + # Grab root device + # Naming scheme: https://askubuntu.com/questions/56929/what-is-the-linux-drive-naming-scheme + # - SCSI/SATA: /dev/sd[a-z][0-9] + # - IDE: /dev/hd[a-z][0-9] + # - eMMC: /dev/mmcblk[0-9]p[0-9] + # - NVMe: /dev/nvme[0-9]n[0-9]p[0-9] + TARGET_DEV=$(findmnt / -o source -n) + if [[ $TARGET_DEV == '/dev/mmcblk'* || $TARGET_DEV == '/dev/nvme'* ]]; then -sync + TARGET_PARTITION=${TARGET_DEV##*p} # /dev/mmcblk0p1 => 1 + TARGET_DRIVE=${TARGET_DEV%p[0-9]} # /dev/mmcblk0p1 => /dev/mmcblk0 -# Naming scheme: https://askubuntu.com/questions/56929/what-is-the-linux-drive-naming-scheme -# - SCSI/SATA: /dev/sd[a-z][0-9] -# - IDE: /dev/hd[a-z][0-9] -# - eMMC: /dev/mmcblk[0-9]p[0-9] -# - NVMe: /dev/nvme[0-9]n[0-9]p[0-9] -TARGET_DEV=$(findmnt / -o source -n) -if [[ $TARGET_DEV =~ /mmcblk || $TARGET_DEV =~ /nvme ]]; then + elif [[ $TARGET_DEV == /dev/[sh]d[a-z]* ]]; then - TARGET_PARTITION=${TARGET_DEV##*p} # /dev/mmcblk0p1 => 1 - TARGET_DRIVE=${TARGET_DEV%p[0-9]} # /dev/mmcblk0p1 => /dev/mmcblk0 + TARGET_PARTITION=${TARGET_DEV##*[a-z]} # /dev/sda1 => 1 + TARGET_DRIVE=${TARGET_DEV%[0-9]} # /dev/sda1 => /dev/sda -elif [[ $TARGET_DEV =~ /[sh]d[a-z] ]]; then + else - TARGET_PARTITION=${TARGET_DEV##*[a-z]} # /dev/sda1 => 1 - TARGET_DRIVE=${TARGET_DEV%[0-9]} # /dev/sda1 => /dev/sda + echo "[FAILED] Unsupported block device naming scheme ($TARGET_DEV). Aborting..." + exit 1 -else - - echo "[FAILED] Unsupported drive naming scheme: $TARGET_DEV. Aborting..." - exit 1 + fi -fi + # Resize partition, only if drive actually contains a partition table + if [[ $TARGET_PARTITION == [0-9] ]]; then -# Only redo partitions, if drive actually contains a partition table. -if [[ $TARGET_PARTITION == [0-9] ]]; then + # - Failsafe: Sync changes to disk before touching partitions + sync - # - GPT detection | modified version of ayufan-rock64 resize script. - if sfdisk $TARGET_DRIVE -l | grep -qi 'disklabel type: gpt'; then + # - GPT detection | Modified version of ayufan-rock64 resize script + if sfdisk $TARGET_DRIVE -l | grep -qi 'disklabel type: gpt'; then - # move GPT alternate header to end of disk - sgdisk -e $TARGET_DRIVE + # Move GPT alternate header to end of disk + sgdisk -e $TARGET_DRIVE - fi + fi - # - Maximize partition size - sfdisk $TARGET_DRIVE -fN$TARGET_PARTITION --no-reread <<< ',+,,,' + # - Maximize partition size + sfdisk $TARGET_DRIVE -fN$TARGET_PARTITION --no-reread <<< ',+,,,' - partprobe $TARGET_DRIVE + # - Reread partition table + partprobe $TARGET_DRIVE -else + else - echo "[ INFO ] No valid root partition found: $TARGET_PARTITION. Skipping partition resize..." + echo "[ INFO ] No (valid) root partition found ($TARGET_PARTITION). Most likely the drive does not contain a partition table. Skipping partition resize..." -fi + fi -resize2fs $TARGET_DEV + # Resize file system + resize2fs $TARGET_DEV -exit 0 + exit 0 +}