#!/bin/bash { #//////////////////////////////////// # DietPi Software # #//////////////////////////////////// # Created by Daniel Knight / daniel.knight@dietpi.com / dietpi.com # #//////////////////////////////////// # # Info: # - filename /DietPi/dietpi/dietpi-software # - Installs "ready to run" software with optimizations unique to the device. # - Runs dietpi-update during 1st run setup. # - Generates and uses /DietPi/dietpi/.installed (software list) # 0=not installed, 1=selected for install, 2=installed # # Usage: # - dietpi-software # - /DietPi/dietpi/dietpi-software install iUNIQUEID (OR) sINDEX_{SSHSERVER,FILESERVER,LOGGING,WEBSERVER}_TARGET=-int # - /DietPi/dietpi/dietpi-software reinstall #Same as installed, however, only reinstalls if state =2. Does not uninstall due to package removal danger (eg: xserver removes kodi), simply flags to be installed (=1). # - /DietPi/dietpi/dietpi-software uninstall iUNIQUEID # - /DietPi/dietpi/dietpi-software list #Lists UNIQUEIDs for software. # - /DietPi/dietpi/dietpi-software setpermissions #Sets shared permissions for /var/www and userdata folders. #//////////////////////////////////// #Import DietPi-Globals --------------------------------------------------------------- . /DietPi/dietpi/func/dietpi-globals G_CHECK_ROOT_USER G_CHECK_ROOTFS_RW export G_PROGRAM_NAME='DietPi-Software' #Import DietPi-Globals --------------------------------------------------------------- #///////////////////////////////////////////////////////////////////////////////////// #Filepath #///////////////////////////////////////////////////////////////////////////////////// FP_INSTALLED_FILE='/DietPi/dietpi/.installed' FP_INSTALLED_FILE_TEMP='/tmp/dietpi-software.installed' FP_DIETPIAUTOMATION_LOG='/root/DietPi-Automation.log' #Used to set user/personal data directories (eg: usbdrive) FP_DIETPI_DEDICATED_USBDRIVE='' #Uninstall temp file UNINSTALL_FILE='/tmp/dietpi_uninstall_list' #Default user content folders used in DietPi. FOLDER_MUSIC='Music' FOLDER_PICTURES='Pictures' FOLDER_VIDEO='Video' FOLDER_DOWNLOADS='downloads' Write_InstallFileList(){ local write_software_in_pending_state=0 local fp_target="$FP_INSTALLED_FILE" if [ "$1" = "temp" ]; then fp_target="$FP_INSTALLED_FILE_TEMP" write_software_in_pending_state=1 fi rm "$fp_target" &> /dev/null #Save installed states for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do # - Never save pending state for software (=1). Excluding temp saves. if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 1 && ! $write_software_in_pending_state )); then echo -e "aSOFTWARE_INSTALL_STATE[$i]=0" >> "$fp_target" else echo -e "aSOFTWARE_INSTALL_STATE[$i]=${aSOFTWARE_INSTALL_STATE[$i]}" >> "$fp_target" fi done #Misc cat << _EOF_ >> "$fp_target" #DietPi Choice System: SSH Server INDEX_SSHSERVER_CURRENT=$INDEX_SSHSERVER_CURRENT INDEX_SSHSERVER_TARGET=$INDEX_SSHSERVER_TARGET #DietPi Choice System: File Server INDEX_FILESERVER_CURRENT=$INDEX_FILESERVER_CURRENT INDEX_FILESERVER_TARGET=$INDEX_FILESERVER_TARGET #DietPi Choice System: Logging INDEX_LOGGING_CURRENT=$INDEX_LOGGING_CURRENT INDEX_LOGGING_TARGET=$INDEX_LOGGING_TARGET #DietPi Preference System: Webserver base INDEX_WEBSERVER_CURRENT=$INDEX_WEBSERVER_CURRENT INDEX_WEBSERVER_TARGET=$INDEX_WEBSERVER_TARGET _EOF_ } Read_InstallFileList(){ local fp_target="$FP_INSTALLED_FILE" if [ "$1" = "temp" ]; then fp_target="$FP_INSTALLED_FILE_TEMP" fi #Load Software states G_DIETPI-NOTIFY 2 "Reading database, please wait..." #Load if [ -f "$fp_target" ]; then . "$fp_target" fi #Always reset choice system during first run to defaults: https://github.com/Fourdee/DietPi/issues/1122 if (( $G_DIETPI_INSTALL_STAGE == 0 )); then INDEX_SSHSERVER_CURRENT=-1 INDEX_SSHSERVER_TARGET=-1 INDEX_FILESERVER_CURRENT=0 INDEX_FILESERVER_TARGET=0 INDEX_LOGGING_CURRENT=-1 INDEX_LOGGING_TARGET=-1 INDEX_WEBSERVER_CURRENT=-2 INDEX_WEBSERVER_TARGET=-2 fi } Reset_NTPD(){ killall -w /DietPi/dietpi/func/run_ntpd &> /dev/null killall -w ntpd &> /dev/null rm /var/lib/dietpi/.ntpd_exit_status &> /dev/null } Check_NTPD_Status(){ if (( $(route | awk '{print $4}' | grep -ci -m1 'UG') )); then while true do /DietPi/dietpi/func/run_ntpd status if (( $? != 0 )); then # Endless retry if (( ! $G_USER_INPUTS )); then Reset_NTPD # Ask else whiptail --title "NTPD update failed" --yesno "NTPD timesync has not yet completed, or, failed to update. To prevent issues with outdated system time during installations, you must either:\n\n - Retry NTPD update (recommended)\nThis will kill the current NTPD process and retry NTPD update. If this fails again, please use option below.\n\n - Override (last resort)\nThis will override NTPD update checks, however, your system time will be out of sync and may cause issues during installations.\n\nYou can check the NTPD logs for debugging purposes with:\n cat /var/log/ntpd.log" --yes-button "Override" --no-button "Retry" --defaultno --backtitle "$WHIP_BACKTITLE" 20 80 if (( $? == 1 )); then Reset_NTPD else Reset_NTPD echo 0 > /var/lib/dietpi/.ntpd_exit_status echo 1 > /var/lib/dietpi/.ntpd_override fi fi else break fi done fi } #///////////////////////////////////////////////////////////////////////////////////// # Installation System #///////////////////////////////////////////////////////////////////////////////////// #Reboot after installation has finished. DISABLE_REBOOT=0 #Global Password: Exception to AUTO first run init. GLOBAL_PW=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_GLOBAL_PASSWORD=' | sed 's/.*=//') if [ ! -n "$GLOBAL_PW" ]; then GLOBAL_PW='dietpi' fi #Total system RAM (used to calculate percentage based value for software cache levels, eg: opcache/apcu max sizes) RAM_TOTAL=$(free -m | grep -m1 'Mem:' | awk '{print $2}') #Run Installation Flag (1 = run installs) GOSTARTINSTALL=0 INSTALL_URL_ADDRESS='' INSTALL_DESCRIPTION='DietPi' #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 FP_PHP_BASE_DIR='/etc/php/7.0' PHP_APT_PACKAGE_NAME='php' if (( $G_DISTRO < 4 )); then FP_PHP_BASE_DIR='/etc/php5' PHP_APT_PACKAGE_NAME='php5' fi # USBDRIVE=0 #Choices Made? INSTALL_DIETPI_CHOICESMADE=0 INSTALL_LINUX_CHOICESMADE=0 #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 INSTALL_FILESERVER_CHOICESMADE=0 INDEX_FILESERVER_CURRENT=0 INDEX_FILESERVER_TARGET=0 #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 INDEX_WEBSERVER_CURRENT=-2 INDEX_WEBSERVER_TARGET=-2 #Create DietPi-Software Arrays # - Categories aSOFTWARE_CATEGORIES_DIETPI=0 #List of cats MAX_SOFTWARE_CATEGORIES_DIETPI=0 aSOFTWARE_CATEGORIES_LINUX=0 MAX_SOFTWARE_CATEGORIES_LINUX=0 # - Software #NB: All software has a unique index that must not be changed (eg: DESKTOP_LXDE = 23) TOTAL_SOFTWARE_INDEXS=0 TOTAL_SOFTWARE_INDEXS_HARDLIMIT=171 #Increase as needed. Must be higher than TOTAL_SOFTWARE_INDEXS once calculated in Software_Arrays_Init INSTALLING_INDEX=0 #Which software index is currently being installed? aSOFTWARE_CATEGORY_INDEX=0 #Category index aSOFTWARE_TYPE=0 #0=DietPi 1=Linux | -1=Hidden from install menu, visible in uninstall menu | -2 Hidden from all menus aSOFTWARE_INSTALL_STATE=0 #0=not / 1=tobe, or not tobe that is the... / 2=installed aSOFTWARE_WHIP_NAME=0 #Item name eg: Kodi aSOFTWARE_WHIP_DESC=0 #Blah blah FP_ONLINEDOC_URL='http://dietpi.com/phpbb/viewtopic.php?' aSOFTWARE_ONLINEDOC_URL=0 # - Disable software installation, if user input is required for automated installs aSOFTWARE_REQUIRES_USERINPUT=0 # - Optional pre req software that needs to be installed aSOFTWARE_REQUIRES_ALSA=0 aSOFTWARE_REQUIRES_XSERVERXORG=0 aSOFTWARE_REQUIRES_MYSQL=0 aSOFTWARE_REQUIRES_SQLITE=0 aSOFTWARE_REQUIRES_WEBSERVER=0 aSOFTWARE_REQUIRES_DESKTOP=0 aSOFTWARE_REQUIRES_GIT=0 aSOFTWARE_REQUIRES_BUILDESSENTIAL=0 aSOFTWARE_REQUIRES_RSYSLOG=0 aSOFTWARE_REQUIRES_FFMPEG=0 aSOFTWARE_REQUIRES_ORACLEJAVA=0 aSOFTWARE_REQUIRES_NODEJS=0 # - 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 # 2D array (well, bash style) declare -A aSOFTWARE_AVAIL_G_HW_MODEL declare -A aSOFTWARE_AVAIL_G_HW_ARCH #///////////////////////////////////////////////////////////////////////////////////// # This function generates the array for all the software avaliable to be installed. # # Reference: # - Adding new software to DietPi-Software # https://github.com/Fourdee/DietPi/issues/490#issuecomment-244416570 # # Adding Software to the Install List: # ------------------------------------ # - index_current: # This is the next number in the sequence. Each software install has a unique number, # so it can be referenced in all arrays. This has to be the same for install, uninstall # and setting up the service. Run "dietpi-software list | grep 'index Current'" to # get the next number in the sequence. Ensure that you are running a testing build, as # release may be behind the testing branch and avaliable software packages. # # - aSOFTWARE_WHIP_NAME: # This is the name to display in the UI. # # - aSOFTWARE_WHIP_DESC: # This is the description to place next to the name in the UI. # # - aSOFTWARE_CATEGORY_INDEX: # If you are adding a new peice of software, first choose the category it belongs to # (see aSOFTWARE_CATEGORIES_DIETPI and aSOFTWARE_CATEGORIES_LINUX below), which will # give you the aSOFTWARE_CATEGORY_INDEX to set. In the example below this is 0. # # - aSOFTWARE_TYPE: # If this is aSOFTWARE_CATEGORIES_DIETPI then aSOFTWARE_TYPE=0, if it is # aSOFTWARE_CATEGORIES_LINUX then it is 1. In the example it is 0. # # - aSOFTWARE_ONLINEDOC_URL: # This is appeneded to FP_ONLINEDOC_URL to make a URL for help on this software. # # Specifying other software as dependencies: # If your software needs other software to be available, look under the 'Requires software # to be installed' heading and then add that to the section you create. In the example # below ALSA and XSERVERXORG are needed. The system will check their presence # and install as needed. # # Dealing with Hardware types: # If you have hardware requirements, like must not/only be installed on a Pi, then you need # 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'. # # # - Disabled for All non-rpi # for ((i=10; i<=$MAX_G_HW_MODEL; i++)) # do # aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 # done # # Example: # #------------------ Desktops: LXDE ------------------ # index_current=23 # aSOFTWARE_WHIP_NAME[$index_current]='LXDE' # aSOFTWARE_WHIP_DESC[$index_current]='ultra lightweight desktop' # aSOFTWARE_CATEGORY_INDEX[$index_current]=0 # aSOFTWARE_TYPE[$index_current]=0 # aSOFTWARE_REQUIRES_ALSA[$index_current]=1 # aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 # aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p42' # #///////////////////////////////////////////////////////////////////////////////////// Software_Arrays_Init(){ #-------------------------------------------------------------------------------- #Categories #NB: Unique Indexs, do not re-arrange or re-order. #-------------------------------------------------------------------------------- #DietPi software aSOFTWARE_CATEGORIES_DIETPI=( "────Desktops──────────────────────────────────────────────" #0 "────Remote Desktop Access─────────────────────────────────" #1 "────Media Systems─────────────────────────────────────────" #2 "────BitTorrent / Download Tools───────────────────────────" #3 "────Cloud / Backups───────────────────────────────────────" #4 "────Emulation & Gaming────────────────────────────────────" #5 "────Social / Search───────────────────────────────────────" #6 "────Camera / Surveillance─────────────────────────────────" #7 "────WiFi Hotspot──────────────────────────────────────────" #8 "────System Stats / Management─────────────────────────────" #9 "────Remote Access─────────────────────────────────────────" #10 "────Hardware Projects─────────────────────────────────────" #11 "────System Security───────────────────────────────────────" #12 "────Webserver Stacks──────────────────────────────────────" #13 "────Pi-hole───────────────────────────────────────────────" #14 "────File Servers──────────────────────────────────────────" #15 "────VPN Servers───────────────────────────────────────────" #16 "────Advanced Networking───────────────────────────────────" #17 "────Home Automation───────────────────────────────────────" #18 "────Printing──────────────────────────────────────────────" #19 ) MAX_SOFTWARE_CATEGORIES_DIETPI=${#aSOFTWARE_CATEGORIES_DIETPI[@]} #Linux software aSOFTWARE_CATEGORIES_LINUX=( "────SSH Clients───────────────────────────────────────────" #0 "────Fileserver Clients────────────────────────────────────" #1 "────File Managers─────────────────────────────────────────" #2 "────System────────────────────────────────────────────────" #3 "────Shared Libraries──────────────────────────────────────" #4 "────Networking / Tools────────────────────────────────────" #5 "────Development / Programming─────────────────────────────" #6 "────Text Editors──────────────────────────────────────────" #7 "────Desktop Utilities─────────────────────────────────────" #8 ) MAX_SOFTWARE_CATEGORIES_LINUX=${#aSOFTWARE_CATEGORIES_LINUX[@]} #-------------------------------------------------------------------------------- #Init | Available For #-------------------------------------------------------------------------------- #Set available by default for all devices and arch local debug_array_count=0 for ((i=0; i<$TOTAL_SOFTWARE_INDEXS_HARDLIMIT; i++)) do for ((j=0; j<=$MAX_G_HW_MODEL; j++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$i,$j]=1 # ((debug_array_count++)) # echo -e "$debug_array_count ${aSOFTWARE_AVAIL_G_HW_MODEL[$i,$j]}" done done for ((i=0; i<$TOTAL_SOFTWARE_INDEXS_HARDLIMIT; i++)) do for ((j=0; j<=$MAX_G_HW_ARCH; j++)) do aSOFTWARE_AVAIL_G_HW_ARCH[$i,$j]=1 # ((debug_array_count++)) # echo -e "$debug_array_count ${aSOFTWARE_AVAIL_G_HW_ARCH[$i,$j]}" done done #-------------------------------------------------------------------------------- #Int Online Docs #-------------------------------------------------------------------------------- for ((i=0; i<$TOTAL_SOFTWARE_INDEXS_HARDLIMIT; i++)) do aSOFTWARE_ONLINEDOC_URL[$i]='' done #-------------------------------------------------------------------------------- #Requires software to be installed #-------------------------------------------------------------------------------- #As we don't define this for all software, init the arrays to 0 for ((i=0; i<$TOTAL_SOFTWARE_INDEXS_HARDLIMIT; i++)) do aSOFTWARE_REQUIRES_USERINPUT[$i]=0 aSOFTWARE_REQUIRES_ALSA[$i]=0 aSOFTWARE_REQUIRES_XSERVERXORG[$i]=0 aSOFTWARE_REQUIRES_MYSQL[$i]=0 aSOFTWARE_REQUIRES_SQLITE[$i]=0 aSOFTWARE_REQUIRES_WEBSERVER[$i]=0 aSOFTWARE_REQUIRES_DESKTOP[$i]=0 aSOFTWARE_REQUIRES_GIT[$i]=0 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$i]=0 aSOFTWARE_REQUIRES_RSYSLOG[$i]=0 aSOFTWARE_REQUIRES_FFMPEG[$i]=0 aSOFTWARE_REQUIRES_ORACLEJAVA[$i]=0 aSOFTWARE_REQUIRES_NODEJS[$i]=0 done #-------------------------------------------------------------------------------- #DietPi software items #-------------------------------------------------------------------------------- #Assign UNIQUE index to each item local index_current=0 #Desktops #-------------------------------------------------------------------------------- index_current=23 aSOFTWARE_WHIP_NAME[$index_current]='LXDE' aSOFTWARE_WHIP_DESC[$index_current]='ultra lightweight desktop' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p42' #------------------ index_current=24 aSOFTWARE_WHIP_NAME[$index_current]='MATE' aSOFTWARE_WHIP_DESC[$index_current]='desktop enviroment' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=60#p2073' #------------------ index_current=25 aSOFTWARE_WHIP_NAME[$index_current]='XFCE' aSOFTWARE_WHIP_DESC[$index_current]='lightweight desktop environment' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=70#p2203' #------------------ index_current=26 aSOFTWARE_WHIP_NAME[$index_current]='GNUStep' aSOFTWARE_WHIP_DESC[$index_current]='lightweight based on OpenStep' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=60#p2072' #------------------ index_current=113 aSOFTWARE_WHIP_NAME[$index_current]='Chromium' aSOFTWARE_WHIP_DESC[$index_current]='(Optional) web browser' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='http://dietpi.com/phpbb/viewtopic.php?f=8&t=5&p=3011#p3011' # - ARMv6 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,1]=0 # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,20]=0 #Remote Desktops #-------------------------------------------------------------------------------- index_current=27 aSOFTWARE_WHIP_NAME[$index_current]='TightVNC Server' aSOFTWARE_WHIP_DESC[$index_current]='desktop for remote connection' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p408' # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 # - Disable for Stretch, replaced by tigervnc (vnc4) if (( $G_DISTRO >= 4 )); then for ((i=0; i<$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done fi #------------------ index_current=28 aSOFTWARE_WHIP_NAME[$index_current]='VNC4 Server' aSOFTWARE_WHIP_DESC[$index_current]='desktop for remote connection' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p408' #------------------ index_current=29 aSOFTWARE_WHIP_NAME[$index_current]='XRDP' aSOFTWARE_WHIP_DESC[$index_current]='remote desktop protocol (rdp) server' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=70#p2074' #------------------ index_current=30 aSOFTWARE_WHIP_NAME[$index_current]='NoMachine' aSOFTWARE_WHIP_DESC[$index_current]='multi-platform server and client access' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=60#p2071' # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #------------------ index_current=120 aSOFTWARE_WHIP_NAME[$index_current]='RealVNC Server' aSOFTWARE_WHIP_DESC[$index_current]='desktop for remote connection' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=4149#p4149' # - License RPi only for ((i=10; i<$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #Media Systems #-------------------------------------------------------------------------------- index_current=31 aSOFTWARE_WHIP_NAME[$index_current]='Kodi' aSOFTWARE_WHIP_DESC[$index_current]='the media centre for linux' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p43' # - Disabled for All non-RPi/Odroid boards for ((i=20; i<$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=32 aSOFTWARE_WHIP_NAME[$index_current]='YMPD' aSOFTWARE_WHIP_DESC[$index_current]='lightweight web interface music player for mpd' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p50' #------------------ index_current=119 aSOFTWARE_WHIP_NAME[$index_current]='CAVA' aSOFTWARE_WHIP_DESC[$index_current]='optional: console audio vis for mpd' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=3928#p3928' # - X86_64 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,10]=0 #------------------ index_current=33 aSOFTWARE_WHIP_NAME[$index_current]='SubSonic 5' aSOFTWARE_WHIP_DESC[$index_current]='web interface media streaming server' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 aSOFTWARE_REQUIRES_ORACLEJAVA[$index_current]=1 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p213' #------------------ index_current=34 aSOFTWARE_WHIP_NAME[$index_current]='SubSonic 6' aSOFTWARE_WHIP_DESC[$index_current]='web interface media streaming server' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 aSOFTWARE_REQUIRES_ORACLEJAVA[$index_current]=1 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p213' #------------------ index_current=35 aSOFTWARE_WHIP_NAME[$index_current]='SqueezeBox' aSOFTWARE_WHIP_DESC[$index_current]='logitech media server (lms)' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1009#p1009' #------------------ index_current=36 aSOFTWARE_WHIP_NAME[$index_current]='SqueezeLite' aSOFTWARE_WHIP_DESC[$index_current]='audio player for lms & squeezebox' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1009#p1009' #------------------ index_current=37 aSOFTWARE_WHIP_NAME[$index_current]='Shairport Sync' aSOFTWARE_WHIP_DESC[$index_current]='airplay audio player with multiroom sync' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1221#p1221' # - x86_64 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,10]=0 #------------------ index_current=38 aSOFTWARE_WHIP_NAME[$index_current]='BruteFIR' aSOFTWARE_WHIP_DESC[$index_current]='eq and digital room correction via alsa' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=57#p57' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=39 aSOFTWARE_WHIP_NAME[$index_current]='ReadyMedia' aSOFTWARE_WHIP_DESC[$index_current]='(MiniDLNA) media streaming server (dlna, upnp)' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p49' #------------------ index_current=40 aSOFTWARE_WHIP_NAME[$index_current]='Ampache' aSOFTWARE_WHIP_DESC[$index_current]='web interface media streaming server' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=40#p554' #------------------ index_current=41 aSOFTWARE_WHIP_NAME[$index_current]='Emby Server' aSOFTWARE_WHIP_DESC[$index_current]='web interface media streaming server' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1789#p1789' #disable ARMv6: https://github.com/Fourdee/DietPi/issues/534 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,1]=0 #disable ARMv8: https://github.com/Fourdee/DietPi/issues/1059#issuecomment-313661959 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #------------------ index_current=42 aSOFTWARE_WHIP_NAME[$index_current]='Plex Media Server' aSOFTWARE_WHIP_DESC[$index_current]='web interface media streaming server' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1949#p1949' #disable ARMv6: https://github.com/Fourdee/DietPi/issues/648 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,1]=0 #------------------ index_current=43 aSOFTWARE_WHIP_NAME[$index_current]='Murmur' aSOFTWARE_WHIP_DESC[$index_current]='mumble voip server' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1691#p1691' #------------------ index_current=118 aSOFTWARE_WHIP_NAME[$index_current]='Mopidy' aSOFTWARE_WHIP_DESC[$index_current]='web interface music & radio player' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=80#p3611' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 #------------------ index_current=121 aSOFTWARE_WHIP_NAME[$index_current]='Roon Bridge' aSOFTWARE_WHIP_DESC[$index_current]='Turns device into Roon capable audio player' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=80#p4153' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 # - Currently ARMv7/64 only, so disable all archs for ((i=0; i<=$MAX_G_HW_ARCH; i++)) do aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,$i]=0 done # renable for armv7/64 for ((i=2; i<=10; i++)) do aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,$i]=1 done #------------------ index_current=124 aSOFTWARE_WHIP_NAME[$index_current]='NAA daemon' aSOFTWARE_WHIP_DESC[$index_current]='signalyst network audio adaptor (naa)' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=90#p4294' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 # - Currently ARMv7+ only, so disable all archs for ((i=0; i<=$MAX_G_HW_ARCH; i++)) do aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,$i]=0 done # renable for armv7+ aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,2]=1 #------------------ index_current=128 aSOFTWARE_WHIP_NAME[$index_current]='MPD' aSOFTWARE_WHIP_DESC[$index_current]='music player daemon' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='' #------------------ index_current=129 aSOFTWARE_WHIP_NAME[$index_current]='O!MPD' aSOFTWARE_WHIP_DESC[$index_current]='feature-rich, web interface audio player for mpd' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=5171#p5171' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,20]=0 #------------------ index_current=135 aSOFTWARE_WHIP_NAME[$index_current]='IceCast' aSOFTWARE_WHIP_DESC[$index_current]='Shoutcast streaming server (+DarkIce)' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6526#p6526' # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,20]=0 #------------------ index_current=141 aSOFTWARE_WHIP_NAME[$index_current]='Spotify Connect Web' aSOFTWARE_WHIP_DESC[$index_current]='web interface for spotify premium' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7013#p7013' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 # - Currently ARMv7+ only, so disable all archs for ((i=0; i<=$MAX_G_HW_ARCH; i++)) do aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,$i]=0 done # renable for armv7+ aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,2]=1 #------------------ index_current=143 aSOFTWARE_WHIP_NAME[$index_current]='Koel' aSOFTWARE_WHIP_DESC[$index_current]='web interface audio streamer' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7305#p7305' aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_REQUIRES_NODEJS[$index_current]=1 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 #------------------ index_current=146 aSOFTWARE_WHIP_NAME[$index_current]='PlexPy' aSOFTWARE_WHIP_DESC[$index_current]='monitoring and tracking tool for Plex' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7463#p7463' aSOFTWARE_REQUIRES_GIT[$index_current]=1 # - Disabled for ARM64 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #------------------ index_current=148 aSOFTWARE_WHIP_NAME[$index_current]='JRiver MC' aSOFTWARE_WHIP_DESC[$index_current]='media centre' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=110#p7536' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=154 aSOFTWARE_WHIP_NAME[$index_current]='Roon Server' aSOFTWARE_WHIP_DESC[$index_current]='Roon capable audio player and core' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7966#p7966' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 # - x86_64 for ((i=0; i<=$MAX_G_HW_ARCH; i++)) do aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,$i]=0 done aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,10]=1 #------------------ index_current=159 aSOFTWARE_WHIP_NAME[$index_current]='Allo' aSOFTWARE_WHIP_DESC[$index_current]='web interface' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 #------------------ index_current=160 aSOFTWARE_WHIP_NAME[$index_current]='Allo_update' aSOFTWARE_WHIP_DESC[$index_current]='quick reinstall/update web only' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='' #------------------ index_current=163 aSOFTWARE_WHIP_NAME[$index_current]='Gmediarender' aSOFTWARE_WHIP_DESC[$index_current]='DLNA audio render/endpoint' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=9012#p9012' #------------------ index_current=167 aSOFTWARE_WHIP_NAME[$index_current]='Raspotify' aSOFTWARE_WHIP_DESC[$index_current]='spotify connect client' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=9368#p9368' #disable ARMv8: aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #disable x86_64: aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,10]=0 #------------------ index_current=168 aSOFTWARE_WHIP_NAME[$index_current]='moOde' aSOFTWARE_WHIP_DESC[$index_current]='audiophile-quality music playback' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_SQLITE[$index_current]=1 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='xxxxxxxxxxxxxxxxx' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #BitTorrent #-------------------------------------------------------------------------------- index_current=44 aSOFTWARE_WHIP_NAME[$index_current]='Transmission' aSOFTWARE_WHIP_DESC[$index_current]='bittorrent server with web interface (c)' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p46' #------------------ index_current=45 aSOFTWARE_WHIP_NAME[$index_current]='Deluge' aSOFTWARE_WHIP_DESC[$index_current]='bittorrent server with web interface (python)' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p61' #------------------ index_current=46 aSOFTWARE_WHIP_NAME[$index_current]='qBitTorrent' aSOFTWARE_WHIP_DESC[$index_current]='bittorrent server with web interface (c++)' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=70#p2272' #------------------ index_current=107 aSOFTWARE_WHIP_NAME[$index_current]='rTorrent' aSOFTWARE_WHIP_DESC[$index_current]='bittorrent server with rutorrent web interface' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 #aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=2603#p2603' #------------------ index_current=116 aSOFTWARE_WHIP_NAME[$index_current]='SickRage' aSOFTWARE_WHIP_DESC[$index_current]='automatically download TV shows' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=3327#p3327' #------------------ index_current=132 aSOFTWARE_WHIP_NAME[$index_current]='Aria2' aSOFTWARE_WHIP_DESC[$index_current]='download manager with web interface' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6177#p6177' aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_SQLITE[$index_current]=1 #------------------ index_current=139 aSOFTWARE_WHIP_NAME[$index_current]='SABnzbd' aSOFTWARE_WHIP_DESC[$index_current]='nzb download manager' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6747#p6747' aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 #------------------ index_current=142 aSOFTWARE_WHIP_NAME[$index_current]='CouchPotato' aSOFTWARE_WHIP_DESC[$index_current]='automatically download movies' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6747#p6747' aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_REQUIRES_GIT[$index_current]=1 #------------------ index_current=144 aSOFTWARE_WHIP_NAME[$index_current]='Sonarr' aSOFTWARE_WHIP_DESC[$index_current]='automatically download TV shows' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7455#p7455' #------------------ index_current=145 aSOFTWARE_WHIP_NAME[$index_current]='Radarr' aSOFTWARE_WHIP_DESC[$index_current]='automatically download movies' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7457#p7457' #------------------ index_current=147 aSOFTWARE_WHIP_NAME[$index_current]='Jackett' aSOFTWARE_WHIP_DESC[$index_current]='api Support for your torrent trackers.' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7503#p7503' #------------------ index_current=149 aSOFTWARE_WHIP_NAME[$index_current]='NZBget' aSOFTWARE_WHIP_DESC[$index_current]='nzb download manager' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7575#p7575' #------------------ BitTorrent: HTPC Manager ------------------ index_current=155 aSOFTWARE_WHIP_NAME[$index_current]='HTPC Manager' aSOFTWARE_WHIP_DESC[$index_current]='manage your HTPC from anywhere' aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=8043#p8043' #Cloud / Backups #-------------------------------------------------------------------------------- index_current=47 aSOFTWARE_WHIP_NAME[$index_current]='ownCloud' aSOFTWARE_WHIP_DESC[$index_current]='your very own cloud (eg: dropbox)' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p47' #------------------ index_current=114 aSOFTWARE_WHIP_NAME[$index_current]='Nextcloud' aSOFTWARE_WHIP_DESC[$index_current]='A safe home for all your data' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=3026#p3026' #------------------ index_current=48 aSOFTWARE_WHIP_NAME[$index_current]='Pydio' aSOFTWARE_WHIP_DESC[$index_current]='feature-rich backup and sync server' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1064#p1064' #------------------ index_current=111 aSOFTWARE_WHIP_NAME[$index_current]='UrBackup server' aSOFTWARE_WHIP_DESC[$index_current]='full system backup server' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=65#p65' #No deb packages for ARMv6: aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,1]=0 #------------------ index_current=49 aSOFTWARE_WHIP_NAME[$index_current]='Gogs' aSOFTWARE_WHIP_DESC[$index_current]='personal github server with web interface' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=70#p2187' # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #------------------ index_current=50 aSOFTWARE_WHIP_NAME[$index_current]='Syncthing' aSOFTWARE_WHIP_DESC[$index_current]='backup and sync server with web interface' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=70#p2363' #------------------ index_current=134 aSOFTWARE_WHIP_NAME[$index_current]='Tonido' aSOFTWARE_WHIP_DESC[$index_current]='lightweight cloud based backup system' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6476#p6476' # - ARMv6 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,1]=0 # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #------------------ index_current=158 aSOFTWARE_WHIP_NAME[$index_current]='Minio' aSOFTWARE_WHIP_DESC[$index_current]='S3 compatible distributed object server' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 #------------------ index_current=161 aSOFTWARE_WHIP_NAME[$index_current]='FuguHub' aSOFTWARE_WHIP_DESC[$index_current]='Lightweight WebDAV cloud (eg: dropbox) with a CMS' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 # - x86_64 #aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,10]=0 # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #------------------ index_current=165 aSOFTWARE_WHIP_NAME[$index_current]='Gitea' aSOFTWARE_WHIP_DESC[$index_current]='Git with a cup of tea' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=9863#p9863' #Emulation / Gaming #-------------------------------------------------------------------------------- index_current=108 aSOFTWARE_WHIP_NAME[$index_current]='AmiBerry' aSOFTWARE_WHIP_DESC[$index_current]='amiga emulator' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=64#p64' aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=51 aSOFTWARE_WHIP_NAME[$index_current]='OpenTyrian' aSOFTWARE_WHIP_DESC[$index_current]='a classic retro game, addictive' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p45' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=112 aSOFTWARE_WHIP_NAME[$index_current]='DXX-Rebirth' aSOFTWARE_WHIP_DESC[$index_current]='Descent 1/2' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=2963#p2963' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=52 aSOFTWARE_WHIP_NAME[$index_current]='Cuberite' aSOFTWARE_WHIP_DESC[$index_current]='minecraft server with web interface (c++)' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=60#p2068' # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #------------------ index_current=53 aSOFTWARE_WHIP_NAME[$index_current]='MineOS' aSOFTWARE_WHIP_DESC[$index_current]='minecraft servers with web interface (java)' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_REQUIRES_ORACLEJAVA[$index_current]=1 aSOFTWARE_REQUIRES_NODEJS[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=60#p2069' #------------------ index_current=156 aSOFTWARE_WHIP_NAME[$index_current]='Steam' aSOFTWARE_WHIP_DESC[$index_current]='client' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=8016#p8016' aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 #Native PC only for ((i=0; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,21]=1 #------------------ index_current=164 aSOFTWARE_WHIP_NAME[$index_current]='Nukkit' aSOFTWARE_WHIP_DESC[$index_current]='A nuclear-powered server for Minecraft Pocket Edition' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ORACLEJAVA[$index_current]=1 #Social Media #-------------------------------------------------------------------------------- index_current=54 aSOFTWARE_WHIP_NAME[$index_current]='Forums' aSOFTWARE_WHIP_DESC[$index_current]='phpbb forums' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=5#p51' #------------------ index_current=55 aSOFTWARE_WHIP_NAME[$index_current]='Wordpress' aSOFTWARE_WHIP_DESC[$index_current]='website blog and publishing platform' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p395' #------------------ index_current=56 aSOFTWARE_WHIP_NAME[$index_current]='Image Gallery' aSOFTWARE_WHIP_DESC[$index_current]='website to host / browse your images' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=40#p480' #------------------ index_current=57 aSOFTWARE_WHIP_NAME[$index_current]='BaiKal' aSOFTWARE_WHIP_DESC[$index_current]='lightweight caldav + carddav server' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=50#p1502' #------------------ index_current=58 aSOFTWARE_WHIP_NAME[$index_current]='OpenBazaar' aSOFTWARE_WHIP_DESC[$index_current]='decentralized peer to peer bitcoin market' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1796#p1796' #------------------ index_current=133 aSOFTWARE_WHIP_NAME[$index_current]='YaCy' aSOFTWARE_WHIP_DESC[$index_current]='decentralized open source search engine' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ORACLEJAVA[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6202#p6202' #------------------ #Camera #-------------------------------------------------------------------------------- index_current=59 aSOFTWARE_WHIP_NAME[$index_current]='DietPi Cam' aSOFTWARE_WHIP_DESC[$index_current]='web interface & controls for your rpi camera' aSOFTWARE_CATEGORY_INDEX[$index_current]=7 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p48' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=136 aSOFTWARE_WHIP_NAME[$index_current]='MotionEye' aSOFTWARE_WHIP_DESC[$index_current]='web interface & surveillance for your camera' aSOFTWARE_CATEGORY_INDEX[$index_current]=7 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6610#p6610' aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ #WiFi Hotspot #-------------------------------------------------------------------------------- index_current=60 aSOFTWARE_WHIP_NAME[$index_current]='WiFi Hotspot' aSOFTWARE_WHIP_DESC[$index_current]='turn your device into a wifi hotspot' aSOFTWARE_CATEGORY_INDEX[$index_current]=8 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1207#p1207' # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,20]=0 #------------------ index_current=61 aSOFTWARE_WHIP_NAME[$index_current]='Tor Hotspot' aSOFTWARE_WHIP_DESC[$index_current]='optional: route hotspot traffic through tor' aSOFTWARE_CATEGORY_INDEX[$index_current]=8 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1529#p1529' # - VM aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,20]=0 #------------------ #System stats #-------------------------------------------------------------------------------- index_current=62 aSOFTWARE_WHIP_NAME[$index_current]='DietPi-Cloudshell' aSOFTWARE_WHIP_DESC[$index_current]='system stats displayed on lcd/panel' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p204' #------------------ index_current=63 aSOFTWARE_WHIP_NAME[$index_current]='LinuxDash' aSOFTWARE_WHIP_DESC[$index_current]='web interface system stats' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p108' #------------------ index_current=64 aSOFTWARE_WHIP_NAME[$index_current]='PhpSysInfo' aSOFTWARE_WHIP_DESC[$index_current]='web interface system stats' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p451' #------------------ index_current=65 aSOFTWARE_WHIP_NAME[$index_current]='NetData' aSOFTWARE_WHIP_DESC[$index_current]='real-time performance monitoring' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_NODEJS[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=60#p1611' #------------------ index_current=66 aSOFTWARE_WHIP_NAME[$index_current]='RPi-Monitor' aSOFTWARE_WHIP_DESC[$index_current]='web interface system stats' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=50#p1503' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=106 aSOFTWARE_WHIP_NAME[$index_current]='Raspcontrol' aSOFTWARE_WHIP_DESC[$index_current]='web interface system stats' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p89' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=115 aSOFTWARE_WHIP_NAME[$index_current]='Webmin' aSOFTWARE_WHIP_DESC[$index_current]='web interface system management' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=80#p3047' aSOFTWARE_REQUIRES_RSYSLOG[$index_current]=1 #------------------ index_current=126 aSOFTWARE_WHIP_NAME[$index_current]='OpenMediaVault' aSOFTWARE_WHIP_DESC[$index_current]='nas solution with web interface' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=-1 #:https://github.com/Fourdee/DietPi/issues/851 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=4859#p4859' aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_USERINPUT[$index_current]=1 #------------------ index_current=162 aSOFTWARE_WHIP_NAME[$index_current]='Docker' aSOFTWARE_WHIP_DESC[$index_current]='Build, ship, and run distributed applications' aSOFTWARE_CATEGORY_INDEX[$index_current]=9 aSOFTWARE_TYPE[$index_current]=0 # - ARMv8 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 #Remote Access #-------------------------------------------------------------------------------- index_current=67 aSOFTWARE_WHIP_NAME[$index_current]='NoIp' aSOFTWARE_WHIP_DESC[$index_current]='url website address for your device' aSOFTWARE_CATEGORY_INDEX[$index_current]=10 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p58' #------------------ index_current=68 aSOFTWARE_WHIP_NAME[$index_current]='Remot3.it' aSOFTWARE_WHIP_DESC[$index_current]='(Weaved) access your device over the internet' aSOFTWARE_CATEGORY_INDEX[$index_current]=10 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p188' # - Currently ARMv7+ only, so disable all archs for ((i=0; i<=$MAX_G_HW_ARCH; i++)) do aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,$i]=0 done # renable for armv6/7 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,1]=1 aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,2]=1 #------------------ index_current=138 aSOFTWARE_WHIP_NAME[$index_current]='VirtualHere' aSOFTWARE_WHIP_DESC[$index_current]='server: share USB devices over the network' aSOFTWARE_CATEGORY_INDEX[$index_current]=10 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6709#p6709' #------------------ #Hardware projects #-------------------------------------------------------------------------------- index_current=69 aSOFTWARE_WHIP_NAME[$index_current]='RPi.GPIO' aSOFTWARE_WHIP_DESC[$index_current]='gpio interface library for rpi (python)' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=40#p1065' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=70 aSOFTWARE_WHIP_NAME[$index_current]='WiringPi' aSOFTWARE_WHIP_DESC[$index_current]='gpio interface library (c)' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1066#p1066' # - RPi / Odroids for ((i=20; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #+ BPi Pro aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,51]=1 #------------------ index_current=71 aSOFTWARE_WHIP_NAME[$index_current]='WebIOPi' aSOFTWARE_WHIP_DESC[$index_current]='web interface to control rpi.gpio' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p189' # - Disabled for All non-rpi and RPi3 for ((i=3; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=72 aSOFTWARE_WHIP_NAME[$index_current]='I2c' aSOFTWARE_WHIP_DESC[$index_current]='enables support for i2c based hardware' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=122 aSOFTWARE_WHIP_NAME[$index_current]='Node-Red' aSOFTWARE_WHIP_DESC[$index_current]='tool for wiring devices, APIs and online services' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_NODEJS[$index_current]=1 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=80#p4292' #------------------ index_current=123 aSOFTWARE_WHIP_NAME[$index_current]='Mosquitto ' aSOFTWARE_WHIP_DESC[$index_current]='MQTT messaging broker' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=90#p4293' #------------------ index_current=131 aSOFTWARE_WHIP_NAME[$index_current]='Blynk Server' aSOFTWARE_WHIP_DESC[$index_current]='msg controller for blynk mobile app and sbcs' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=5901#p5901' aSOFTWARE_REQUIRES_ORACLEJAVA[$index_current]=1 aSOFTWARE_REQUIRES_NODEJS[$index_current]=1 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 #------------------ index_current=166 aSOFTWARE_WHIP_NAME[$index_current]='PI-SPC' aSOFTWARE_WHIP_DESC[$index_current]='audiophonics pi-spc power control module' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=9359#p9359' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=169 aSOFTWARE_WHIP_NAME[$index_current]='Google AIY' aSOFTWARE_WHIP_DESC[$index_current]='voice kit' aSOFTWARE_CATEGORY_INDEX[$index_current]=11 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_ALSA[$index_current]=1 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=9486#p9486' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #System security #-------------------------------------------------------------------------------- index_current=73 aSOFTWARE_WHIP_NAME[$index_current]='Fail2Ban' aSOFTWARE_WHIP_DESC[$index_current]='prevents brute-force attacks with ip ban' aSOFTWARE_CATEGORY_INDEX[$index_current]=12 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_RSYSLOG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p452' #------------------ #Webserver stacks #-------------------------------------------------------------------------------- index_current=75 aSOFTWARE_WHIP_NAME[$index_current]='LASP' aSOFTWARE_WHIP_DESC[$index_current]='apache2 | sqlite | php' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p52' #------------------ index_current=76 aSOFTWARE_WHIP_NAME[$index_current]='LAAP' aSOFTWARE_WHIP_DESC[$index_current]='apache2 | mariadb | php' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p52' #------------------ index_current=78 aSOFTWARE_WHIP_NAME[$index_current]='LESP' aSOFTWARE_WHIP_DESC[$index_current]='nginx | sqlite | php' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p5' #------------------ index_current=79 aSOFTWARE_WHIP_NAME[$index_current]='LEAP' aSOFTWARE_WHIP_DESC[$index_current]='nginx | mariadb | php' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p5' #------------------ index_current=81 aSOFTWARE_WHIP_NAME[$index_current]='LLSP' aSOFTWARE_WHIP_DESC[$index_current]='lighttpd | sqlite | php' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1335#p1335' #------------------ index_current=82 aSOFTWARE_WHIP_NAME[$index_current]='LLAP' aSOFTWARE_WHIP_DESC[$index_current]='lighttpd | mariadb | php' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1335#p1335' #------------------ index_current=83 aSOFTWARE_WHIP_NAME[$index_current]='Apache2' aSOFTWARE_WHIP_DESC[$index_current]='webserver' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p52' #------------------ index_current=84 aSOFTWARE_WHIP_NAME[$index_current]='Lighttpd' aSOFTWARE_WHIP_DESC[$index_current]='webserver' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1335#p1335' #------------------ index_current=85 aSOFTWARE_WHIP_NAME[$index_current]='Nginx' aSOFTWARE_WHIP_DESC[$index_current]='webserver' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5#p5' #------------------ index_current=87 aSOFTWARE_WHIP_NAME[$index_current]='SQlite' aSOFTWARE_WHIP_DESC[$index_current]='database' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1335#p1335' #------------------ index_current=88 aSOFTWARE_WHIP_NAME[$index_current]='MariaDB' aSOFTWARE_WHIP_DESC[$index_current]='database' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1335#p1335' #------------------ index_current=89 aSOFTWARE_WHIP_NAME[$index_current]='PHP' aSOFTWARE_WHIP_DESC[$index_current]='webserver' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1335#p1335' #------------------ index_current=90 aSOFTWARE_WHIP_NAME[$index_current]='phpMyAdmin' aSOFTWARE_WHIP_DESC[$index_current]='optional mysql admin tools' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_MYSQL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p54' #------------------ index_current=91 aSOFTWARE_WHIP_NAME[$index_current]='Redis' aSOFTWARE_WHIP_DESC[$index_current]='optional non-sql database store' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 #------------------ index_current=92 aSOFTWARE_WHIP_NAME[$index_current]='CertBot' aSOFTWARE_WHIP_DESC[$index_current]='free, ssl cert install allowing https://' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1061#p1062' #------------------ index_current=125 aSOFTWARE_WHIP_NAME[$index_current]='Tomcat8' aSOFTWARE_WHIP_DESC[$index_current]='apache tomcat server' aSOFTWARE_CATEGORY_INDEX[$index_current]=13 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=4316#p4316' aSOFTWARE_REQUIRES_ORACLEJAVA[$index_current]=1 #PiHole #-------------------------------------------------------------------------------- index_current=93 aSOFTWARE_WHIP_NAME[$index_current]='Pi-hole' aSOFTWARE_WHIP_DESC[$index_current]='block adverts for any device on your network' aSOFTWARE_CATEGORY_INDEX[$index_current]=14 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p174' aSOFTWARE_REQUIRES_USERINPUT[$index_current]=1 #------------------ #File servers #-------------------------------------------------------------------------------- index_current=94 aSOFTWARE_WHIP_NAME[$index_current]='ProFTP' aSOFTWARE_WHIP_DESC[$index_current]='lightweight ftp server' aSOFTWARE_CATEGORY_INDEX[$index_current]=15 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p55' #------------------ index_current=95 aSOFTWARE_WHIP_NAME[$index_current]='vsFTPD' aSOFTWARE_WHIP_DESC[$index_current]='alternative ftp server' aSOFTWARE_CATEGORY_INDEX[$index_current]=15 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='?f=8&t=5&p=2820#p2820' #------------------ index_current=96 aSOFTWARE_WHIP_NAME[$index_current]='Samba' aSOFTWARE_WHIP_DESC[$index_current]='feature-rich file server' aSOFTWARE_CATEGORY_INDEX[$index_current]=15 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p56' #------------------ index_current=109 aSOFTWARE_WHIP_NAME[$index_current]='NFS' aSOFTWARE_WHIP_DESC[$index_current]='network file system server' aSOFTWARE_CATEGORY_INDEX[$index_current]=15 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p56' #------------------ #VPN servers #-------------------------------------------------------------------------------- index_current=97 aSOFTWARE_WHIP_NAME[$index_current]='OpenVPN' aSOFTWARE_WHIP_DESC[$index_current]='vpn server' aSOFTWARE_CATEGORY_INDEX[$index_current]=16 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_RSYSLOG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=613#p613' #------------------ index_current=117 aSOFTWARE_WHIP_NAME[$index_current]='PiVPN' aSOFTWARE_WHIP_DESC[$index_current]='openvpn installer & management tool' aSOFTWARE_CATEGORY_INDEX[$index_current]=16 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_RSYSLOG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='http://dietpi.com/phpbb/viewtopic.php?f=8&t=5&p=3469#p3469' aSOFTWARE_REQUIRES_USERINPUT[$index_current]=1 #------------------ #Advanced Networking #-------------------------------------------------------------------------------- index_current=98 aSOFTWARE_WHIP_NAME[$index_current]='HaProxy' aSOFTWARE_WHIP_DESC[$index_current]='high performance tcp/http load balancer' aSOFTWARE_CATEGORY_INDEX[$index_current]=17 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=30#p221' #Home automation #-------------------------------------------------------------------------------- index_current=99 aSOFTWARE_WHIP_NAME[$index_current]='EmonPi' aSOFTWARE_WHIP_DESC[$index_current]='energy usage addon board with web interface' aSOFTWARE_CATEGORY_INDEX[$index_current]=18 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=1529#p1525' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=100 aSOFTWARE_WHIP_NAME[$index_current]='Grasshopper' aSOFTWARE_WHIP_DESC[$index_current]='web app to control bticino myhome' aSOFTWARE_CATEGORY_INDEX[$index_current]=18 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_WEBSERVER[$index_current]=1 aSOFTWARE_REQUIRES_SQLITE[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p70' # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ Home Automation: Home Assistant ------------------ index_current=157 aSOFTWARE_WHIP_NAME[$index_current]='Home Assistant' aSOFTWARE_WHIP_DESC[$index_current]='open-source home automation platform' aSOFTWARE_CATEGORY_INDEX[$index_current]=18 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_REQUIRES_GIT[$index_current]=1 aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_REQUIRES_SQLITE[$index_current]=1 aSOFTWARE_REQUIRES_FFMPEG[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p70' #------------------ #Printing #-------------------------------------------------------------------------------- index_current=137 aSOFTWARE_WHIP_NAME[$index_current]='CloudPrint' aSOFTWARE_WHIP_DESC[$index_current]='print server for google cloud print' aSOFTWARE_CATEGORY_INDEX[$index_current]=19 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=6630#p6630' aSOFTWARE_REQUIRES_RSYSLOG[$index_current]=1 #Not required, but comes in as package dep #Disabled for ARMv8 on Jessie only: https://github.com/Fourdee/DietPi/issues/855#issuecomment-292712002 if (( $G_DISTRO == 3 )); then aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0 fi #------------------ index_current=153 aSOFTWARE_WHIP_NAME[$index_current]='OctoPrint' aSOFTWARE_WHIP_DESC[$index_current]='web interface for controlling 3d printers' aSOFTWARE_CATEGORY_INDEX[$index_current]=19 aSOFTWARE_TYPE[$index_current]=0 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&p=7958#p7958' aSOFTWARE_REQUIRES_BUILDESSENTIAL[$index_current]=1 aSOFTWARE_REQUIRES_GIT[$index_current]=1 # Required for updates #-------------------------------------------------------------------------------- #Additional linux software items #-------------------------------------------------------------------------------- #SSH clients #-------------------------------------------------------------------------------- index_current=0 aSOFTWARE_WHIP_NAME[$index_current]='OpenSSH Client' aSOFTWARE_WHIP_DESC[$index_current]='' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=1 #------------------ #File server clients #-------------------------------------------------------------------------------- index_current=1 aSOFTWARE_WHIP_NAME[$index_current]='Samba Client' aSOFTWARE_WHIP_DESC[$index_current]='access network shares' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]=' dietpi-config > Network Options: NAS/Misc' #------------------ index_current=2 aSOFTWARE_WHIP_NAME[$index_current]='Curlftpfs' aSOFTWARE_WHIP_DESC[$index_current]='ftp client with filesystem mount' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]=' dietpi-config > Network Options: NAS/Misc' #------------------ index_current=110 aSOFTWARE_WHIP_NAME[$index_current]='NFS Client' aSOFTWARE_WHIP_DESC[$index_current]='network file system client' aSOFTWARE_CATEGORY_INDEX[$index_current]=1 aSOFTWARE_TYPE[$index_current]=1 aSOFTWARE_ONLINEDOC_URL[$index_current]=' dietpi-config > Network Options: NAS/Misc' #------------------ #File managers #-------------------------------------------------------------------------------- index_current=3 aSOFTWARE_WHIP_NAME[$index_current]='MC' aSOFTWARE_WHIP_DESC[$index_current]='midnight commander, powerful file manager' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=4 aSOFTWARE_WHIP_NAME[$index_current]='ViFM' aSOFTWARE_WHIP_DESC[$index_current]='file manager with vi bindings' aSOFTWARE_CATEGORY_INDEX[$index_current]=2 aSOFTWARE_TYPE[$index_current]=1 #------------------ #System #-------------------------------------------------------------------------------- index_current=5 aSOFTWARE_WHIP_NAME[$index_current]='ALSA' aSOFTWARE_WHIP_DESC[$index_current]='linux sound system' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=6 aSOFTWARE_WHIP_NAME[$index_current]='Xserver' aSOFTWARE_WHIP_DESC[$index_current]='linux display system' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=151 aSOFTWARE_WHIP_NAME[$index_current]='Nvidia' aSOFTWARE_WHIP_DESC[$index_current]='display driver' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=1 aSOFTWARE_REQUIRES_XSERVERXORG[$index_current]=1 for ((i=0; i<$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,21]=1 #------------------ index_current=170 aSOFTWARE_WHIP_NAME[$index_current]='NTP' aSOFTWARE_WHIP_DESC[$index_current]='date and time sync' aSOFTWARE_CATEGORY_INDEX[$index_current]=3 aSOFTWARE_TYPE[$index_current]=-1 #Hidden, use dietpi-config > advanced > timesync to setup #Shared Libs #-------------------------------------------------------------------------------- index_current=7 aSOFTWARE_WHIP_NAME[$index_current]='FFmpeg' aSOFTWARE_WHIP_DESC[$index_current]='audio & visual libary' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=8 aSOFTWARE_WHIP_NAME[$index_current]='Java' aSOFTWARE_WHIP_DESC[$index_current]='OpenJDK 8 + JRE libary' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=9 aSOFTWARE_WHIP_NAME[$index_current]='Node.js' aSOFTWARE_WHIP_DESC[$index_current]='javascript runtime' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=130 aSOFTWARE_WHIP_NAME[$index_current]='Python Pip' aSOFTWARE_WHIP_DESC[$index_current]='python pip package installer' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=140 aSOFTWARE_WHIP_NAME[$index_current]='SDL2' aSOFTWARE_WHIP_DESC[$index_current]='simple direct layer 2' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=1 # - Disabled for All non-rpi for ((i=10; i<=$MAX_G_HW_MODEL; i++)) do aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0 done #------------------ index_current=150 aSOFTWARE_WHIP_NAME[$index_current]='Mono' aSOFTWARE_WHIP_DESC[$index_current]='runtime libraries and repo' aSOFTWARE_CATEGORY_INDEX[$index_current]=4 aSOFTWARE_TYPE[$index_current]=1 #Networking #-------------------------------------------------------------------------------- index_current=10 aSOFTWARE_WHIP_NAME[$index_current]='iftop' aSOFTWARE_WHIP_DESC[$index_current]='displays bandwidth usage information' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=11 aSOFTWARE_WHIP_NAME[$index_current]='IPTraf' aSOFTWARE_WHIP_DESC[$index_current]='interactive colorful ip lan monitor' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=12 aSOFTWARE_WHIP_NAME[$index_current]='Iperf' aSOFTWARE_WHIP_DESC[$index_current]='internet protocol bandwidth measuring tool' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=13 aSOFTWARE_WHIP_NAME[$index_current]='MTR-Tiny' aSOFTWARE_WHIP_DESC[$index_current]='full screen ncurses traceroute tool' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=14 aSOFTWARE_WHIP_NAME[$index_current]='nLoad' aSOFTWARE_WHIP_DESC[$index_current]='realtime console network usage monitor' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=15 aSOFTWARE_WHIP_NAME[$index_current]='tcpdump' aSOFTWARE_WHIP_DESC[$index_current]='command-line network traffic analyzer' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=152 aSOFTWARE_WHIP_NAME[$index_current]='Avahi-Daemon' aSOFTWARE_WHIP_DESC[$index_current]='hostname broadcast (mac, pc bonjour)' aSOFTWARE_CATEGORY_INDEX[$index_current]=5 aSOFTWARE_TYPE[$index_current]=1 #Development / Programming #-------------------------------------------------------------------------------- index_current=16 aSOFTWARE_WHIP_NAME[$index_current]='Build-Essentials' aSOFTWARE_WHIP_DESC[$index_current]='common packages for compile' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=17 aSOFTWARE_WHIP_NAME[$index_current]='Git Client' aSOFTWARE_WHIP_DESC[$index_current]='git clone etc' aSOFTWARE_CATEGORY_INDEX[$index_current]=6 aSOFTWARE_TYPE[$index_current]=1 #------------------ #Text Editors #-------------------------------------------------------------------------------- index_current=18 aSOFTWARE_WHIP_NAME[$index_current]='Emacs' aSOFTWARE_WHIP_DESC[$index_current]='gnu emacs editor' aSOFTWARE_CATEGORY_INDEX[$index_current]=7 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=19 aSOFTWARE_WHIP_NAME[$index_current]='Jed' aSOFTWARE_WHIP_DESC[$index_current]='editor for programmers' aSOFTWARE_CATEGORY_INDEX[$index_current]=7 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=20 aSOFTWARE_WHIP_NAME[$index_current]='Vim' aSOFTWARE_WHIP_DESC[$index_current]='vi enhanced text editor' aSOFTWARE_CATEGORY_INDEX[$index_current]=7 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=21 aSOFTWARE_WHIP_NAME[$index_current]='Vim-Tiny' aSOFTWARE_WHIP_DESC[$index_current]='compact release of vim' aSOFTWARE_CATEGORY_INDEX[$index_current]=7 aSOFTWARE_TYPE[$index_current]=1 #------------------ index_current=127 aSOFTWARE_WHIP_NAME[$index_current]='NeoVim' aSOFTWARE_WHIP_DESC[$index_current]='heavily refactored vim fork' aSOFTWARE_CATEGORY_INDEX[$index_current]=7 aSOFTWARE_TYPE[$index_current]=1 # - Stretch only if (( $G_DISTRO < 4 )); then aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$G_HW_MODEL]=0 fi #------------------ #Desktop Utilities #-------------------------------------------------------------------------------- index_current=22 aSOFTWARE_WHIP_NAME[$index_current]='QuiteRSS' aSOFTWARE_WHIP_DESC[$index_current]='cross-platform, free rss reader' aSOFTWARE_CATEGORY_INDEX[$index_current]=8 aSOFTWARE_TYPE[$index_current]=1 aSOFTWARE_REQUIRES_DESKTOP[$index_current]=1 #------------------ #-------------------------------------------------------------------------------- #Logging (hidden) #-------------------------------------------------------------------------------- index_current=101 aSOFTWARE_WHIP_NAME[$index_current]='Log Rotate' aSOFTWARE_WHIP_DESC[$index_current]='rotates log files' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p68' #------------------ index_current=102 aSOFTWARE_WHIP_NAME[$index_current]='Rsyslog' aSOFTWARE_WHIP_DESC[$index_current]='system logging' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p68' #------------------ index_current=103 aSOFTWARE_WHIP_NAME[$index_current]='DietPi-Ramlog' aSOFTWARE_WHIP_DESC[$index_current]='minimal, optimized logging' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=20#p68' #------------------ #-------------------------------------------------------------------------------- #SSH servers (hidden from install menu) #-------------------------------------------------------------------------------- index_current=104 aSOFTWARE_WHIP_NAME[$index_current]='Dropbear' aSOFTWARE_WHIP_DESC[$index_current]='ssh server' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p62' #------------------ index_current=105 aSOFTWARE_WHIP_NAME[$index_current]='OpenSSH Server' aSOFTWARE_WHIP_DESC[$index_current]='' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 aSOFTWARE_ONLINEDOC_URL[$index_current]='f=8&t=5&start=10#p63' #------------------ #-------------------------------------------------------------------------------- #Free indexes (due to removal of MySQL) #-------------------------------------------------------------------------------- index_current=74 aSOFTWARE_WHIP_NAME[$index_current]='free index' aSOFTWARE_WHIP_DESC[$index_current]='' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 index_current=77 aSOFTWARE_WHIP_NAME[$index_current]='free index' aSOFTWARE_WHIP_DESC[$index_current]='' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 index_current=80 aSOFTWARE_WHIP_NAME[$index_current]='free index' aSOFTWARE_WHIP_DESC[$index_current]='' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 index_current=86 aSOFTWARE_WHIP_NAME[$index_current]='free index' aSOFTWARE_WHIP_DESC[$index_current]='' aSOFTWARE_CATEGORY_INDEX[$index_current]=0 aSOFTWARE_TYPE[$index_current]=-1 #-------------------------------------------------------------------------------- #Total software installations TOTAL_SOFTWARE_INDEXS=${#aSOFTWARE_TYPE[@]} #-------------------------------------------------------------------------------- #Init Installed state - 0=not 1=to be 2=installed for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do aSOFTWARE_INSTALL_STATE[$i]=0 done #Installed software on DietPi image by default. aSOFTWARE_INSTALL_STATE[103]=2 aSOFTWARE_INSTALL_STATE[104]=2 #-------------------------------------------------------------------------------- } Software_Arrays_Destroy(){ unset aSOFTWARE_CATEGORIES_DIETPI unset aSOFTWARE_CATEGORIES_LINUX unset aSOFTWARE_CATEGORY_INDEX unset aSOFTWARE_TYPE unset aSOFTWARE_WHIP_NAME unset aSOFTWARE_WHIP_DESC unset aSOFTWARE_ONLINEDOC_URL unset aSOFTWARE_INSTALL_STATE unset aSOFTWARE_REQUIRES_USERINPUT unset aSOFTWARE_REQUIRES_ALSA unset aSOFTWARE_REQUIRES_XSERVERXORG unset aSOFTWARE_REQUIRES_MYSQL unset aSOFTWARE_REQUIRES_SQLITE unset aSOFTWARE_REQUIRES_WEBSERVER unset aSOFTWARE_REQUIRES_DESKTOP unset aSOFTWARE_REQUIRES_GIT unset aSOFTWARE_REQUIRES_BUILDESSENTIAL unset aSOFTWARE_REQUIRES_RSYSLOG unset aSOFTWARE_REQUIRES_FFMPEG unset aSOFTWARE_REQUIRES_ORACLEJAVA unset aSOFTWARE_REQUIRES_NODEJS unset aSOFTWARE_AVAIL_G_HW_MODEL unset aSOFTWARE_AVAIL_G_HW_ARCH } #Disable software installation, if user input is required for automated installs Install_Disable_Requires_UserInput(){ if (( ! $G_USER_INPUTS )); then for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 1 && ${aSOFTWARE_REQUIRES_USERINPUT[$i]} )); then # - Disable aSOFTWARE_INSTALL_STATE[$i]=0 G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$i]}: Requires user input and can not be automated." G_DIETPI-NOTIFY 1 "${aSOFTWARE_WHIP_NAME[$i]}: Will not be installed. Please run 'dietpi-software' to install." fi done fi } #Work out which additional software we need to install Install_Flag_Prereq_Software(){ G_DIETPI-NOTIFY 3 DietPi-Software "Checking for prerequisite software" #------------------------------------------------------------------------- #Pre-req software, for items that do not have their own array aSOFTWARE_REQUIRES_SOFTWARENAME local index=0 #Additional software that requires WiringPi # AudioPhonics Pi-SPC if (( ${aSOFTWARE_INSTALL_STATE[166]} == 1 )); then aSOFTWARE_INSTALL_STATE[70]=1 fi #Additional Software required by Allo Web Interface if (( ${aSOFTWARE_INSTALL_STATE[159]} == 1 )); then 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 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 aSOFTWARE_INSTALL_STATE[129]=1 # O!MPD #aSOFTWARE_INSTALL_STATE[152]=1 # Avahi (pulled in by O!MPD) aSOFTWARE_INSTALL_STATE[163]=1 # Gmrender fi #Additional Software required by moOde if (( ${aSOFTWARE_INSTALL_STATE[168]} == 1 )); then #aSOFTWARE_INSTALL_STATE[36]=1 # Squeezelite # Disabled/optional #aSOFTWARE_INSTALL_STATE[37]=1 # Shairport Sync # Disabled/optional #aSOFTWARE_INSTALL_STATE[60]=1 # WiFi Hotspot # Installed as per moOde docs G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[128]} will be installed" aSOFTWARE_INSTALL_STATE[128]=1 # MPD G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[78]} will be installed" aSOFTWARE_INSTALL_STATE[78]=1 # LESP, override user choice for now. G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[1]} will be installed" aSOFTWARE_INSTALL_STATE[1]=1 # Samba Client G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[96]} will be installed" aSOFTWARE_INSTALL_STATE[96]=1 # Samba Server fi #Additional Software required by Google AIY if (( ${aSOFTWARE_INSTALL_STATE[169]} == 1 )); then aSOFTWARE_INSTALL_STATE[69]=1 # RPi.GPIO #aSOFTWARE_INSTALL_STATE[130]=1 # python-pip, enabled in #Software that requires Python-Pip fi #Software that requires Avahi-Daemon index=152 if (( ${aSOFTWARE_INSTALL_STATE[31]} == 1 || ${aSOFTWARE_INSTALL_STATE[37]} == 1 || ${aSOFTWARE_INSTALL_STATE[128]} == 1 || ${aSOFTWARE_INSTALL_STATE[138]} == 1 || ${aSOFTWARE_INSTALL_STATE[163]} == 1 || ${aSOFTWARE_INSTALL_STATE[168]} == 1 )); then if (( ${aSOFTWARE_INSTALL_STATE[$index]} == 0 )); then aSOFTWARE_INSTALL_STATE[$index]=1 #aSOFTWARE_WHIP_NAME G_DIETPI-NOTIFY 2 "${aSOFTWARE_WHIP_NAME[$index]} will be installed" fi fi #Software that requires Mono if (( ${aSOFTWARE_INSTALL_STATE[41]} == 1 || ${aSOFTWARE_INSTALL_STATE[144]} == 1 || ${aSOFTWARE_INSTALL_STATE[145]} == 1 || ${aSOFTWARE_INSTALL_STATE[147]} == 1 )); then if (( ${aSOFTWARE_INSTALL_STATE[150]} == 0 )); then aSOFTWARE_INSTALL_STATE[150]=1 G_DIETPI-NOTIFY 2 "Mono runtime libary will be installed" fi fi #Software that requires SDL2: if (( ${aSOFTWARE_INSTALL_STATE[108]} == 1 )); then if (( ${aSOFTWARE_INSTALL_STATE[140]} == 0 )); then aSOFTWARE_INSTALL_STATE[140]=1 G_DIETPI-NOTIFY 2 "SDL2 will be installed" fi fi #Software that requires Python-Pip: https://github.com/Fourdee/DietPi/issues/784 if (( ${aSOFTWARE_INSTALL_STATE[58]} == 1 || ${aSOFTWARE_INSTALL_STATE[99]} == 1 || ${aSOFTWARE_INSTALL_STATE[118]} == 1 || ${aSOFTWARE_INSTALL_STATE[136]} == 1 || ${aSOFTWARE_INSTALL_STATE[139]} == 1 || ${aSOFTWARE_INSTALL_STATE[142]} == 1 || ${aSOFTWARE_INSTALL_STATE[153]} == 1 || ${aSOFTWARE_INSTALL_STATE[169]} == 1 )); then if (( ${aSOFTWARE_INSTALL_STATE[130]} == 0 )); then aSOFTWARE_INSTALL_STATE[130]=1 G_DIETPI-NOTIFY 2 "Python-Pip will be installed" fi fi #Software that requires MPD # YMPD # Cava # OMPD if (( ${aSOFTWARE_INSTALL_STATE[32]} == 1 || ${aSOFTWARE_INSTALL_STATE[119]} == 1 || ${aSOFTWARE_INSTALL_STATE[129]} == 1 )); then if (( ${aSOFTWARE_INSTALL_STATE[128]} == 0 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[128]=1 G_DIETPI-NOTIFY 2 "MPD will be installed" fi fi #OMV (requires Samba, Proftpd) if (( ${aSOFTWARE_INSTALL_STATE[126]} == 1 )); then #Proftpd if (( ${aSOFTWARE_INSTALL_STATE[94]} == 0 )); then aSOFTWARE_INSTALL_STATE[94]=1 G_DIETPI-NOTIFY 2 "ProFTP will be installed" fi #Samba if (( ${aSOFTWARE_INSTALL_STATE[96]} == 0 )); then aSOFTWARE_INSTALL_STATE[96]=1 G_DIETPI-NOTIFY 2 "Samba Server will be installed" fi fi #Software that requires Redis if (( ${aSOFTWARE_INSTALL_STATE[47]} == 1 || ${aSOFTWARE_INSTALL_STATE[114]} == 1 )); then if (( ${aSOFTWARE_INSTALL_STATE[91]} == 0 )); then aSOFTWARE_INSTALL_STATE[91]=1 G_DIETPI-NOTIFY 2 "Redis will be installed" fi fi #------------------------------------------------------------------------- #Pre-req software, for items that do DO have their own array aSOFTWARE_REQUIRES_SOFTWARENAME # WEBSERVER - Manual stack install # - Define extra DietPi install flags for WEBSERVER_STACKS #LLAP if (( ${aSOFTWARE_INSTALL_STATE[82]} == 1 )); then aSOFTWARE_INSTALL_STATE[84]=1 aSOFTWARE_INSTALL_STATE[88]=1 aSOFTWARE_INSTALL_STATE[89]=1 fi #LLSP if (( ${aSOFTWARE_INSTALL_STATE[81]} == 1 )); then aSOFTWARE_INSTALL_STATE[84]=1 aSOFTWARE_INSTALL_STATE[87]=1 aSOFTWARE_INSTALL_STATE[89]=1 fi #LEAP if (( ${aSOFTWARE_INSTALL_STATE[79]} == 1 )); then aSOFTWARE_INSTALL_STATE[85]=1 aSOFTWARE_INSTALL_STATE[88]=1 aSOFTWARE_INSTALL_STATE[89]=1 fi #LESP if (( ${aSOFTWARE_INSTALL_STATE[78]} == 1 )); then aSOFTWARE_INSTALL_STATE[85]=1 aSOFTWARE_INSTALL_STATE[87]=1 aSOFTWARE_INSTALL_STATE[89]=1 fi #LAAP if (( ${aSOFTWARE_INSTALL_STATE[76]} == 1 )); then aSOFTWARE_INSTALL_STATE[83]=1 aSOFTWARE_INSTALL_STATE[88]=1 aSOFTWARE_INSTALL_STATE[89]=1 fi #LASP if (( ${aSOFTWARE_INSTALL_STATE[75]} == 1 )); then aSOFTWARE_INSTALL_STATE[83]=1 aSOFTWARE_INSTALL_STATE[87]=1 aSOFTWARE_INSTALL_STATE[89]=1 fi #WEBSERVER - Auto install via choice system for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_WEBSERVER[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Check for existing webserver base (eg: apache2/nginx) installation #FOURDEE: We may want to check dpkg for installed packages also? if (( ! ${aSOFTWARE_INSTALL_STATE[83]} && ! ${aSOFTWARE_INSTALL_STATE[84]} && ! ${aSOFTWARE_INSTALL_STATE[85]} )); then # - None found, Select one for Install, based on user preference if (( $INDEX_WEBSERVER_TARGET == 0 )); then #WEBSERVER_APACHE aSOFTWARE_INSTALL_STATE[83]=1 G_DIETPI-NOTIFY 2 "Apache2 will be installed" elif (( $INDEX_WEBSERVER_TARGET == -1 )); then #WEBSERVER_NGINX aSOFTWARE_INSTALL_STATE[85]=1 G_DIETPI-NOTIFY 2 "Nginx will be installed" elif (( $INDEX_WEBSERVER_TARGET == -2 )); then #WEBSERVER_LIGHTTPD aSOFTWARE_INSTALL_STATE[84]=1 G_DIETPI-NOTIFY 2 "Lighttpd will be installed" fi # - Always install WEBSERVER_PHP aSOFTWARE_INSTALL_STATE[89]=1 G_DIETPI-NOTIFY 2 "PHP will be installed" fi break fi done #WEBSERVER_MYSQL for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_MYSQL[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Check for existing MariaDB installations if (( ! ${aSOFTWARE_INSTALL_STATE[88]} )); then #WEBSERVER_MARIADB as new default aSOFTWARE_INSTALL_STATE[88]=1 G_DIETPI-NOTIFY 2 "MariaDB will be installed" fi break fi done #WEBSERVER_SQLITE for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_SQLITE[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then #WEBSERVER_SQLITE aSOFTWARE_INSTALL_STATE[87]=1 G_DIETPI-NOTIFY 2 "SQlite will be installed" break fi done #WEBSERVER - Check for stacks and flag as installing #WEBSERVER_APACHE if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then #SQLite if (( ${aSOFTWARE_INSTALL_STATE[87]} >= 1 )); then #WEBSERVER_LASP aSOFTWARE_INSTALL_STATE[75]=1 fi #MariaDB if (( ${aSOFTWARE_INSTALL_STATE[88]} >= 1 )); then #WEBSERVER_LAAP aSOFTWARE_INSTALL_STATE[76]=1 fi #WEBSERVER_NGINX elif (( ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then #SQLite if (( ${aSOFTWARE_INSTALL_STATE[87]} >= 1 )); then #WEBSERVER_LESP aSOFTWARE_INSTALL_STATE[78]=1 fi #MariaDB if (( ${aSOFTWARE_INSTALL_STATE[88]} >= 1 )); then #WEBSERVER_LEAP aSOFTWARE_INSTALL_STATE[79]=1 fi #WEBSERVER_LIGHTTPD elif (( ${aSOFTWARE_INSTALL_STATE[84]} >= 1 )); then #SQLite if (( ${aSOFTWARE_INSTALL_STATE[87]} >= 1 )); then #WEBSERVER_LLSP aSOFTWARE_INSTALL_STATE[81]=1 fi #MariaDB if (( ${aSOFTWARE_INSTALL_STATE[88]} >= 1 )); then #WEBSERVER_LLAP aSOFTWARE_INSTALL_STATE[82]=1 fi fi #DESKTOP for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_DESKTOP[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - If no desktop is selected or installed (0), default to LXDE if (( ! ${aSOFTWARE_INSTALL_STATE[23]} && ! ${aSOFTWARE_INSTALL_STATE[24]} && ! ${aSOFTWARE_INSTALL_STATE[25]} && ! ${aSOFTWARE_INSTALL_STATE[26]} )); then aSOFTWARE_INSTALL_STATE[23]=1 G_DIETPI-NOTIFY 2 "LXDE desktop will be installed" fi break fi done #GIT for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_GIT[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[17]=1 G_DIETPI-NOTIFY 2 "Git will be installed" break fi done #BUILDESSENTIAL for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_BUILDESSENTIAL[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[16]=1 G_DIETPI-NOTIFY 2 "Build-Essential will be installed" break fi done #RSYSLOG for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_RSYSLOG[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[102]=1 G_DIETPI-NOTIFY 2 "Rsyslog will be installed" break fi done #FFMPEG for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_FFMPEG[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[7]=1 G_DIETPI-NOTIFY 2 "FFmpeg will be installed" break fi done #ORACLEJAVA for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_ORACLEJAVA[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[8]=1 G_DIETPI-NOTIFY 2 "OpenJDK 8 will be installed" break fi done #NODEJS for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_NODEJS[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[9]=1 G_DIETPI-NOTIFY 2 "NodeJS will be installed" break fi done #ALSA for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_ALSA[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[5]=1 G_DIETPI-NOTIFY 2 "Alsa will be installed" break fi done #XSERVERXORG for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_REQUIRES_XSERVERXORG[$i]} && ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then # - Flag for install aSOFTWARE_INSTALL_STATE[6]=1 G_DIETPI-NOTIFY 2 "Xserver will be installed" break fi done } Create_Desktop_Shared_Items(){ #Copy DietPi favourite links wget http://dietpi.com/downloads/conf/desktop/.gtk-bookmarks -O "$HOME"/.gtk-bookmarks #Create Desktop SymLinks mkdir -p "$HOME"/Desktop ln -sf /usr/share/applications/htop.desktop "$HOME"/Desktop/htop.desktop #DietPi Menu symlinks mkdir -p /usr/share/applications wget http://dietpi.com/downloads/conf/desktop/dietpi-software.desktop -O /usr/share/applications/dietpi-software.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-update.desktop -O /usr/share/applications/dietpi-update.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-config.desktop -O /usr/share/applications/dietpi-config.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-backup.desktop -O /usr/share/applications/dietpi-backup.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-sync.desktop -O /usr/share/applications/dietpi-sync.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-bugreport.desktop -O /usr/share/applications/dietpi-bugreport.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-process_tool.desktop -O /usr/share/applications/dietpi-process_tool.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-cleaner.desktop -O /usr/share/applications/dietpi-cleaner.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-cron.desktop -O /usr/share/applications/dietpi-cron.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-launcher.desktop -O /usr/share/applications/dietpi-launcher.desktop wget http://dietpi.com/downloads/conf/desktop/dietpi-justboom.desktop -O /usr/share/applications/dietpi-justboom.desktop #DietPi Desktop symlinks ln -sf /usr/share/applications/dietpi-software.desktop "$HOME"/Desktop/dietpi-software.desktop ln -sf /usr/share/applications/dietpi-config.desktop "$HOME"/Desktop/dietpi-config.desktop ln -sf /usr/share/applications/dietpi-launcher.desktop "$HOME"/Desktop/dietpi-launcher.desktop #Download icons mkdir -p /var/lib/dietpi/dietpi-software/installed/desktop_icons wget http://dietpi.com/downloads/conf/desktop/dietpi-icon.png -O /var/lib/dietpi/dietpi-software/installed/desktop_icons/dietpi-icon.png wget http://dietpi.com/downloads/conf/desktop/grey_16x16.png -O /var/lib/dietpi/dietpi-software/installed/desktop_icons/grey_16x16.png wget http://dietpi.com/downloads/conf/desktop/kodi-icon.png -O /var/lib/dietpi/dietpi-software/installed/desktop_icons/kodi-icon.png wget http://dietpi.com/downloads/conf/desktop/justboom.png -O /var/lib/dietpi/dietpi-software/installed/desktop_icons/justboom.png # - Replace icon dir in .desktop from /etc/dietpi/desktop_icons sed -i 's#^Icon=/etc/dietpi/desktop_icons#Icon=/var/lib/dietpi/dietpi-software/installed/desktop_icons#g' /usr/share/applications/*.desktop # - Set execute to prevent "untrusted" prompt in Mate, and possibily other desktops. chmod +x /usr/share/applications/* chmod +x "$HOME"/Desktop/* } Create_UserContent_Folders(){ mkdir -p "$G_FP_DIETPI_USERDATA"/"$FOLDER_MUSIC" mkdir -p "$G_FP_DIETPI_USERDATA"/"$FOLDER_PICTURES" mkdir -p "$G_FP_DIETPI_USERDATA"/"$FOLDER_VIDEO" mkdir -p "$G_FP_DIETPI_USERDATA"/"$FOLDER_DOWNLOADS" } Download_Test_Media(){ if [ ! -f "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/fourdee_tech.ogg ]; then #Grab My test music wget http://dietpi.com/downloads/audio/fourdee_tech.ogg -O "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/fourdee_tech.ogg #wget http://dietpi.com/downloads/audio/fourdee_space.mp3 -O "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/fourdee_space.mp3 #Grab Absolute Radio Streams wget http://network.absoluteradio.co.uk/core/audio/ogg/live.pls?service=vrbb -O "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/Absolute-Radio.pls wget http://network.absoluteradio.co.uk/core/audio/ogg/live.pls?service=a8bb -O "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/Absolute-Radio-80s.pls wget http://network.absoluteradio.co.uk/core/audio/ogg/live.pls?service=a9bb -O "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/Absolute-Radio-90s.pls wget http://network.absoluteradio.co.uk/core/audio/ogg/live.pls?service=a0bb -O "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/Absolute-Radio-00s.pls fi } #Return optimization values for BitTorrent servers based on device and hardware capabilities. Optimize_BitTorrent(){ local output=0 local gigabit_device=1 # - Lets hope the next RPi device is finally gigabit capable. I'll cry if it is not. if (( $G_HW_MODEL <= 3 || $G_HW_MODEL == 30 || $G_HW_MODEL == 32 || $G_HW_MODEL == 40 || $G_HW_MODEL == 60 || $G_HW_MODEL == 70 )); then gigabit_device=0 fi #Cache size (MB) 1/10th of total mem if (( $1 == 0 )); then output=$(( $RAM_TOTAL / 10 )) #Max active downloads elif (( $1 == 1 )); then output=2 # - Bump up for VM's if (( $G_HW_MODEL == 20 || $G_HW_MODEL == 21 )); then output=3 fi #Max global connections elif (( $1 == 2 )); then output=20 # - Bump up for VM's if (( $G_HW_MODEL == 20 || $G_HW_MODEL == 21 )); then output=40 # - 1Gbit SBC's 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 elif (( $G_HW_MODEL == 3 )); then output=15 # - RPi v2 elif (( $G_HW_MODEL == 2 )); then output=13 # - RPi v1 256/512 elif (( $G_HW_MODEL <= 1 )); then output=7 fi #Max upload slots elif (( $1 == 3 )); then output=3 # - Bump up for VM's if (( $G_HW_MODEL == 20 || $G_HW_MODEL == 21 )); then output=5 # - 1Gbit 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. elif (( $G_HW_MODEL <= 3 )); then output=2 fi fi echo $output } #///////////////////////////////////////////////////////////////////////////////////// # This function handles the installation of the selected software. # # Reference: # - Adding new software to DietPi-Software # https://github.com/Fourdee/DietPi/issues/490#issuecomment-244416570 # # Installing the software: # ------------------------------------ # - INSTALLING_INDEX: # This has to be the same number as index_current for the software list above. # # - INSTALL_URL_ADDRESS: # This can be used to check conectivity to items you need to download later. # A good example would also be a git repo. # # Example: # #------------------ Bittorrent: HTPC Manager ------------------ # INSTALLING_INDEX=155 # if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then # # Banner_Installing # # INSTALL_URL_ADDRESS='https://github.com/Hellowlol/HTPC-Manager.git' # # G_CHECK_URL "$INSTALL_URL_ADDRESS" # # #Install Python and PIP # G_AGI python python-pip python-imaging # # cd "$HOME" # git clone --depth=1 "$INSTALL_URL_ADDRESS" # # # - Move HTPC Manager to a 'better' location # mkdir -p "$G_FP_DIETPI_USERDATA"/htpc-manager # mv "$HOME"/HTPC-Manager/* "$G_FP_DIETPI_USERDATA"/htpc-manager/ # rm -R "$HOME"/HTPC-Manager # # fi # #///////////////////////////////////////////////////////////////////////////////////// Install_Dietpi_Software(){ #-------------------------------------------------------------- #Install Software #Desktop LXDE INSTALLING_INDEX=23 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - For desktop entries/icons hosted on dietpi.com INSTALL_URL_ADDRESS='http://dietpi.com/downloads/conf/desktop' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI lxde upower policykit-1 iceweasel p7zip-full --no-install-recommends #upower policykit-1. Needed for LXDE logout menu item to show shutdown/restart ...... fi #Desktop MATE INSTALLING_INDEX=24 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - For desktop entries/icons hosted on dietpi.com INSTALL_URL_ADDRESS='http://dietpi.com/downloads/conf/desktop' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI mate-desktop-environment-extras upower policykit-1 iceweasel p7zip-full --no-install-recommends fi #Desktop GNUStep INSTALLING_INDEX=26 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - For desktop entries/icons hosted on dietpi.com INSTALL_URL_ADDRESS='http://dietpi.com/downloads/conf/desktop' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI x-window-system-core wmaker gnustep gnustep-devel gnustep-games libc-dbg upower policykit-1 iceweasel p7zip-full --no-install-recommends fi #DESKTOP_XFCE INSTALLING_INDEX=25 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - For desktop entries/icons hosted on dietpi.com INSTALL_URL_ADDRESS='http://dietpi.com/downloads/conf/desktop' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI xfce4 xfce4-terminal gnome-icon-theme tango-icon-theme iceweasel p7zip-full --no-install-recommends fi #XRDP INSTALLING_INDEX=29 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI xrdp fi #NOMACHINE INSTALLING_INDEX=30 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_DESCRIPTION="NoMachine (Secure RDP Server & Client)" #x86_64 if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/nomachine_5.1.44_1_amd64.deb' #arm6 (RPi1) elif (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/nomachine_5.1.44_3_armv6hf.deb' #arm7+ (RPi 2/3) elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/nomachine_5.1.44_armhf.deb' fi # Now, check that the links are legitimate G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi #BitTorrent Transmission INSTALLING_INDEX=44 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI transmission-daemon fi #ProFTPd INSTALLING_INDEX=94 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing echo -e "proftpd-basic shared/proftpd/inetd_or_standalone select standalone" | debconf-set-selections G_AGI proftpd-basic fi #Samba Server INSTALLING_INDEX=96 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI samba samba-common-bin --no-install-recommends fi #vsFTPD INSTALLING_INDEX=95 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI vsftpd --no-install-recommends fi #NFS_SERVER INSTALLING_INDEX=109 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI nfs-kernel-server nfs-common ucf rpcbind fi #WEBSERVER_APACHE INSTALLING_INDEX=83 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI apache2 fi #WEBSERVER_NGINX INSTALLING_INDEX=85 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI nginx xml-core --no-install-recommends fi #WEBSERVER_LIGHTTPD INSTALLING_INDEX=84 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI lighttpd fi #WEBSERVER_MARIADB INSTALLING_INDEX=88 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # In case remove old symlink, created by DietPi MariaDB installation, otherwise installation will fail. # This will not remove the folder in case, without "-R". [ "$(readlink /var/lib/mysql)" ] && [ ! -d "$(readlink /var/lib/mysql)/mysql" ] && rm /var/lib/mysql G_AGI mariadb-server fi #WEBSERVER_SQLITE INSTALLING_INDEX=87 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI sqlite3 fi #WEBSERVER_REDIS INSTALLING_INDEX=91 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI redis-server #Redis php module | == 2 to check for existing installs, if == 1, then module will be installed together with PHP, to prevent dependency installations if (( ${aSOFTWARE_INSTALL_STATE[89]} == 2 )); then G_AGI "$PHP_APT_PACKAGE_NAME"-redis fi fi #WEBSERVER_PHP INSTALLING_INDEX=89 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Install base PHP packages/modules. if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then G_AGI "$PHP_APT_PACKAGE_NAME" libapache2-mod-"$PHP_APT_PACKAGE_NAME" else G_AGI "$PHP_APT_PACKAGE_NAME"-fpm "$PHP_APT_PACKAGE_NAME"-cgi # 'php-xsl' does not exist for >= Stretch, 'php7.0-xsl' is just dummy for 'php7.0-xml': https://github.com/Fourdee/DietPi/issues/1286 (( $G_DISTRO < 4 )) && G_AGI php5-xsl fi #php-common modules, used by most web software G_AGI "$PHP_APT_PACKAGE_NAME"-curl "$PHP_APT_PACKAGE_NAME"-gd "$PHP_APT_PACKAGE_NAME"-apcu "$PHP_APT_PACKAGE_NAME"-mcrypt # + stretch extras if (( $G_DISTRO >= 4 )); then G_AGI "$PHP_APT_PACKAGE_NAME"-mbstring "$PHP_APT_PACKAGE_NAME"-zip "$PHP_APT_PACKAGE_NAME"-xml fi #php-SQL modules if (( ${aSOFTWARE_INSTALL_STATE[86]} >= 1 )); then G_AGI "$PHP_APT_PACKAGE_NAME"-mysql fi if (( ${aSOFTWARE_INSTALL_STATE[88]} >= 1 )); then if (( $G_DISTRO < 4 )); then #For <= Jessie, php5-mysqlnd provides the newer mysql client libraries compared to php5-mysql. G_AGI "$PHP_APT_PACKAGE_NAME"-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 G_AGI "$PHP_APT_PACKAGE_NAME"-mysql fi fi if (( ${aSOFTWARE_INSTALL_STATE[87]} >= 1 )); then G_AGI "$PHP_APT_PACKAGE_NAME"-sqlite* #wildcard for version (eg:3) fi #Redis php module if (( ${aSOFTWARE_INSTALL_STATE[91]} >= 1 )); then G_AGI "$PHP_APT_PACKAGE_NAME"-redis fi fi #WEBSERVER_MYADMINPHP INSTALLING_INDEX=90 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #MySQL must be running during install to allow debconf setup. G_RUN_CMD systemctl start mysql # Set password parameters before installing debconf-set-selections <<< "phpmyadmin phpmyadmin/dbconfig-install boolean true" debconf-set-selections <<< "phpmyadmin phpmyadmin/mysql/app-pass password $GLOBAL_PW" debconf-set-selections <<< "phpmyadmin phpmyadmin/app-password-confirm password $GLOBAL_PW" if (( ${aSOFTWARE_INSTALL_STATE[83]} == 1 )); then debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect apache2" elif (( ${aSOFTWARE_INSTALL_STATE[84]} == 1 )); then debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect lighttpd" else debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect none" fi G_AGI phpmyadmin fi #MPD INSTALLING_INDEX=128 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Jessie if (( $G_DISTRO == 3 )); then #MPD not available in Jessie Repo for ARMv8 if (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/mpd_0.19.21_arm64.deb' G_CHECK_URL "$INSTALL_URL_ADDRESS" #libupnp6 for net discov with upnp/avahi G_AGI libupnp6 G_AGI libmpdclient2 libao-common libao4 libasound2 libasound2-data libasyncns0 libaudiofile1 libavahi-client3 libavahi-common-data libavahi-common3 libavcodec56 libavformat56 libavresample2 libavutil54 libbinio1ldbl libcaca0 libcdio-cdda1 libcdio-paranoia1 libcdio13 libcups2 libcurl3-gnutls libdirectfb-1.2-9 libdnet libfaad2 libflac8 libfluidsynth1 libgme0 libgomp1 libgsm1 libice6 libid3tag0 libiso9660-8 libjack-jackd2-0 libjson-c2 libldb1 libmad0 libmikmod3 libmms0 libmodplug1 libmp3lame0 libmpcdec6 libmpg123-0 libnfs4 libntdb1 libogg0 libopenal-data libopenal1 libopenjpeg5 libopus0 liborc-0.4-0 libpulse0 libresid-builder0c2a libroar2 libsamplerate0 libschroedinger-1.0-0 libsdl1.2debian libshout3 libsidplay2 libsidutils0 libslp1 libsm6 libsmbclient libsndfile1 libsoxr0 libspeex1 libspeexdsp1 libsqlite3-0 libtalloc2 libtdb1 libtevent0 libtheora0 libupnp6 libva1 libvorbis0a libvorbisenc2 libvorbisfile3 libvpx1 libwavpack1 libwbclient0 libwildmidi-config libwildmidi1 libx11-6 libx11-data libx11-xcb1 libx264-142 libxau6 libxcb1 libxdmcp6 libxext6 libxi6 libxtst6 libxvidcore4 libyajl2 libzzip-0-13 mime-support python python-talloc python2.7 samba-libs x11-common file --no-install-recommends wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb else G_AGI mpd fi #Stretch+ else INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/mpd_0.20.11-1_' #armv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS+='armv6' #armv7+ elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='armv7' #ARMv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='armv8' #x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='amd64' fi INSTALL_URL_ADDRESS+='.deb' G_CHECK_URL "$INSTALL_URL_ADDRESS" #Prereqs G_AGI libmpdclient2 libflac8 libyajl2 libavahi-client3 libvorbisfile3 libwavpack1 libmad0 libmpg123-0 libopus0 libavformat57 libfaad2 libcdio-paranoia1 libiso9660-8 libshout3 libid3tag0 apt-mark unhold mpd &> /dev/null #??? Not required for dpkg -i installs wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb apt-mark hold mpd # prevent repo updates from overwriting fi fi #Forums PHPBB INSTALLING_INDEX=54 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://www.phpbb.com/files/release/phpBB-3.2.1.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /var/www rm package.zip fi #OPENBAZAAR INSTALLING_INDEX=58 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/OpenBazaar/OpenBazaar-Server.git' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI libsodium-dev automake autoconf pkg-config libtool libssl-dev libffi-dev python-dev openssl libzmq3-dev #Not required. #G_AGI software-properties-common #add-apt-repository -y ppa:chris-lea/libsodium #G_AGUP pip install cryptography cd "$HOME" git clone --depth=1 https://github.com/zeromq/libzmq git clone --depth=1 https://github.com/pyca/pynacl/ git clone --depth=1 "$INSTALL_URL_ADDRESS" # - compile cd "$HOME"/libzmq ./autogen.sh && ./configure && make -j $G_HW_CPU_CORES make check && make install && ldconfig cd "$HOME"/pynacl python setup.py build && python setup.py install cd "$HOME" # - Move OpenBazaar to a 'better' location mkdir -p /etc/openbazaar-server mv "$HOME"/OpenBazaar-Server/* /etc/openbazaar-server/ rm -R "$HOME"/OpenBazaar-Server # - install OpenBazaar cd /etc/openbazaar-server pip install -r requirements.txt cd "$HOME" # - Clean up, remove source libraries rm -R "$HOME"/libzmq rm -R "$HOME"/pynacl fi #YACY INSTALLING_INDEX=133 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://yacy.net/release/yacy_v1.92_20161226_9000.tar.gz' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.tar.gz tar xvf package.tar.gz -C /etc/ rm package.tar.gz fi #ownCloud INSTALLING_INDEX=47 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_DIETPI-NOTIFY 2 'Installing needed PHP modules: https://doc.owncloud.org/server/latest/admin_manual/installation/source_installation.html#php-extensions' G_AGI "$PHP_APT_PACKAGE_NAME"-intl "$PHP_APT_PACKAGE_NAME"-redis if [ -f /var/www/owncloud/occ ]; then G_DIETPI-NOTIFY 2 'Existing ownCloud installation found, will NOT overwrite...' else local datadir="$(grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//')" [ -n "$datadir" ] || datadir="$G_FP_DIETPI_USERDATA/owncloud_data" if [ -f "$datadir"/dietpi-owncloud-installation-backup/occ ]; then G_DIETPI-NOTIFY 2 'ownCloud installation backup found, starting recovery...' G_RUN_CMD cp -a "$datadir"/dietpi-owncloud-installation-backup/. /var/www/owncloud else INSTALL_URL_ADDRESS='https://download.owncloud.org/community/owncloud-latest.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_RUN_CMD wget "$INSTALL_URL_ADDRESS" -O package.zip G_RUN_CMD unzip -o package.zip -d /var/www rm package.zip fi fi fi #Nextcloud INSTALLING_INDEX=114 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_DIETPI-NOTIFY 2 'Installing needed PHP modules: https://docs.nextcloud.com/server/12/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation' G_AGI "$PHP_APT_PACKAGE_NAME"-intl "$PHP_APT_PACKAGE_NAME"-redis if [ -f /var/www/nextcloud/occ ]; then G_DIETPI-NOTIFY 2 'Existing Nextcloud installation found, will NOT overwrite...' else local datadir="$(grep -m1 '^[[:blank:]]*SOFTWARE_NEXTCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//')" [ -n "$datadir" ] || datadir="$G_FP_DIETPI_USERDATA/nextcloudcloud_data" if [ -f "$datadir"/dietpi-nextcloud-installation-backup/occ ]; then G_DIETPI-NOTIFY 2 'Nextcloud installation backup found, starting recovery...' G_RUN_CMD cp -a "$datadir"/dietpi-nextcloud-installation-backup/. /var/www/nextcloud else INSTALL_URL_ADDRESS='https://download.nextcloud.com/server/releases/latest.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_RUN_CMD wget "$INSTALL_URL_ADDRESS" -O package.zip G_RUN_CMD unzip -o package.zip -d /var/www rm package.zip fi fi fi #YMPD INSTALLING_INDEX=32 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/ympd_1.2.3.7z' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z local binary_name='ympd_' # - armv6 if (( $G_HW_ARCH == 1 )); then binary_name+='armv6' # - armv7 elif (( $G_HW_ARCH == 2 )); then binary_name+='armv7' # - arm64 elif (( $G_HW_ARCH == 3 )); then binary_name+='armv8' # - x86_64 elif (( $G_HW_ARCH == 10 )); then binary_name+='amd64' fi binary_name+="_$G_DISTRO_NAME" mv "$binary_name" /usr/bin/ympd chmod +x /usr/bin/ympd rm ympd_* rm package.7z fi #Roon Bridge INSTALLING_INDEX=121 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #x86_64 if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='http://download.roonlabs.com/builds/RoonBridge_linuxx64.tar.bz2' #ARMv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='http://download.roonlabs.com/builds/RoonBridge_linuxarmv8.tar.bz2' #ARMv7 else INSTALL_URL_ADDRESS='http://download.roonlabs.com/builds/RoonBridge_linuxarmv7hf.tar.bz2' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.tar.bz2 tar xvf package.tar.bz2 rm package.tar.bz2 # - 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 fi #CAVA INSTALLING_INDEX=119 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - armv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/cava_0.4.2_armv6.deb' # - armv7 elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/cava_0.4.2_armv7.deb' # - arm64 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/cava_0.4.2_arm64.deb' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI libpulse0 libfftw3-3 wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb # + Font for cava, nice bars wget http://dietpi.com/downloads/binaries/all/cava.psf -O "$HOME"/cava.psf fi #Mopidy INSTALLING_INDEX=118 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://apt.mopidy.com/mopidy.gpg' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget -q -O - "$INSTALL_URL_ADDRESS" | apt-key add - # No Buster list available yet, use stretch.list for testing: if (( $G_DISTRO > 4 )); then wget https://apt.mopidy.com/stretch.list -O /etc/apt/sources.list.d/mopidy.list else wget https://apt.mopidy.com/"$G_DISTRO_NAME".list -O /etc/apt/sources.list.d/mopidy.list fi G_AGUP G_AGI mopidy #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. # fi pip install Mopidy-MusicBox-Webclient Mopidy-Local-Images fi #Kodi INSTALLING_INDEX=31 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Odroids if (( $G_HW_MODEL >= 10 )) && (( $G_HW_MODEL < 20 )); then G_AGI kodi-odroid #XU4 - requires pulse audio (fixes corrupt sound) if (( $G_HW_MODEL == 11 )); then G_AGI pulseaudio --no-install-recommends fi #Everything else else G_AGI kodi fi # - libcurl3-gnutls required for C2. But lets apply to all: https://github.com/Fourdee/DietPi/issues/446 G_AGI libcurl3-gnutls # - NFS/CEC support if (( $G_DISTRO >= 4 )); then G_AGI libnfs8 libcec4 else G_AGI libnfs4 libcec3v4 fi fi #MINIDLNA INSTALLING_INDEX=39 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI minidlna fi #NoIp INSTALLING_INDEX=67 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #x32 x64 if (( $G_HW_MODEL == 20 || $G_HW_MODEL == 21 )); then INSTALL_URL_ADDRESS="http://dietpi.com/downloads/binaries/all/noip_x32_x64.zip" #ARMv8 elif (( ( $G_HW_MODEL == 12 ) || ( $G_HW_MODEL >=40 && $G_HW_MODEL < 50 ) )); then INSTALL_URL_ADDRESS="http://dietpi.com/downloads/binaries/all/noip_arm64.zip" #armv6+ else INSTALL_URL_ADDRESS="http://dietpi.com/downloads/binaries/all/noip_armhf.zip" fi G_CHECK_URL "$INSTALL_URL_ADDRESS" #NoIp Binary install wget "$INSTALL_URL_ADDRESS" -O dietpi-noip.zip unzip -o dietpi-noip.zip rm dietpi-noip.zip mv noip_binary /usr/local/bin/noip2 chmod +x /usr/local/bin/noip2 fi #amiberry INSTALLING_INDEX=108 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/amiberry-rpi_v2.1.1.7z' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI alsa-oss joystick libsdl-image1.2 libsdl-ttf2.0-0 libsdl-gfx1.2-5 libguichan-0.8.1-1* libguichan-allegro-0.8.1-1* libguichan-sdl-0.8.1-1* libguichan-opengl-0.8.1-1* libjpgalleg4.4 libxml2 libmpg123-0 #libmpeg2-4 # Required for dev branch # + SDL2 G_AGI libpng12-0 libflac8 libmpg123-0 libgoogle-perftools4 libfreetype6 libxxf86vm1 #Download binaries # - Backup existing autostart.uae for user mv "$G_FP_DIETPI_USERDATA"/amiberry/conf/autostart.uae "$G_FP_DIETPI_USERDATA"/amiberry/conf/autostart_pre-dietpi-update.uae &> /dev/null wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z -o/etc rm package.7z fi #dxx-rebirth INSTALLING_INDEX=112 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/rpi/dxx-rebirth.7z' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI libsdl-mixer1.2 libsdl1.2debian libphysfs1 wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z -o"$G_FP_DIETPI_USERDATA" rm package.7z fi #urbackup server INSTALLING_INDEX=111 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='http://hndl.urbackup.org/Server/2.1.20/urbackup-server_2.1.20_amd64.deb' elif (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS='http://hndl.urbackup.org/Server/2.1.20/urbackup-server_2.1.20_armhf.deb' #ARMv8 sourcebuild elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='http://hndl.urbackup.org/Server/2.1.20/urbackup-server-2.1.20.tar.gz' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" #ARMv8 source build if (( $G_HW_ARCH == 3 )); then G_AGI build-essential zlib1g-dev libcurl4-openssl-dev libcrypto++-dev sqlite3 wget "$INSTALL_URL_ADDRESS" -O package.tar tar xzvf package.tar rm package.tar cd urbackup-server-* ./configure make -j $G_HW_CPU_CORES make install sed -i "/ExecStart=/c ExecStart=/usr/local/bin/urbackupsrv run --config /etc/default/urbackupsrv --no-consoletime" urbackup-server.service cp urbackup-server.service /etc/systemd/system/urbackupsrv.service cp defaults_server /etc/default/urbackupsrv cp logrotate_urbackupsrv /etc/logrotate.d/urbackupsrv cd .. rm -R urbackup-server-* #Deb else wget "$INSTALL_URL_ADDRESS" -O package.deb echo -e "urbackup-server urbackup/backuppath string $G_FP_DIETPI_USERDATA/urbackup" | debconf-set-selections dpkg -i package.deb apt-get -f install -y rm package.deb fi fi #OpenTyrian INSTALLING_INDEX=51 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS="http://dietpi.com/downloads/binaries/rpi/opentyrian_armhf.zip" G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI ibsdl1.2debian libsdl-net1.2 --no-install-recommends #Download binaries wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d / rm package.zip chmod +x /usr/local/games/opentyrian/opentyrian fi #DietPi Cam INSTALLING_INDEX=59 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/Fourdee/RPi_Cam_Web_Interface/archive/6.2.29.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" #Install pre-reqs G_AGI gpac motion #Get source/binaries and extract wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip cd RPi_Cam* #Config /etc/motion mkdir -p /etc/motion cp etc/motion/motion.conf.1 /etc/motion/motion.conf #Config /etc/raspimjpeg cp etc/raspimjpeg/raspimjpeg.1 /etc/raspimjpeg #Setup /var/www/dietpicam mkdir -p /var/www/dietpicam/media cp -R www/* /var/www/dietpicam/ chmod +x /var/www/dietpicam/raspizip.sh mknod /var/www/dietpicam/FIFO p mknod /var/www/dietpicam/FIFO1 p #symlink cam preview and status ln -sf /run/shm/mjpeg/cam.jpg /var/www/dietpicam/cam.jpg ln -sf /run/shm/mjpeg/status_mjpeg.txt /var/www/dietpicam/status_mjpeg.txt #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 cd "$HOME" rm -R "$HOME"/RPi_Cam* fi #DELUGE INSTALLING_INDEX=45 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI deluged deluge-web deluge-webui deluge-console fi #GRASSHOPPER INSTALLING_INDEX=100 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI python #Download Grasshopper local grasshopper_directory='/var/www' INSTALL_URL_ADDRESS='http://sourceforge.net/projects/grasshopperwebapp/files/grasshopper_v5_application.zip/download' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O grasshopper.zip unzip -o grasshopper.zip -d "$grasshopper_directory" rm grasshopper.zip #Install chmod +x "$grasshopper_directory"/install/install.sh "$grasshopper_directory"/install/install.sh fi #RASPCONTROL INSTALLING_INDEX=106 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/harmon25/raspcontrol/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip mkdir -p /var/www/raspcontrol mv raspcontrol-master/* /var/www/raspcontrol rm -R raspcontrol-master fi #WEBMIN INSTALLING_INDEX=115 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://www.webmin.com/download/deb/webmin-current.deb' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb G_AGF rm package.deb fi #OMV INSTALLING_INDEX=126 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://packages.openmediavault.org/public' G_CHECK_URL "$INSTALL_URL_ADDRESS" echo -e "deb $INSTALL_URL_ADDRESS erasmus main" > /etc/apt/sources.list.d/openmediavault.list G_AGUP G_AGI openmediavault-keyring debconf-set-selections <<< "openmediavault openmediavault/run-initsystem note" debconf-set-selections <<< "postfix postfix/main_mailer_type select No configuration" G_AGUP G_AGI openmediavault postfix fi #O!MPD INSTALLING_INDEX=129 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/ArturSierzant/OMPD/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /var/www/ rm -R /var/www/ompd &> /dev/null #Replace/upgrade existing installs mv /var/www/OMPD* /var/www/ompd rm package.zip fi #IceCast + DarkIce INSTALLING_INDEX=135 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI darkice icecast2 fi #LINUXDASH INSTALLING_INDEX=63 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/afaqurk/linux-dash/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip mkdir -p /var/www/linuxdash mv linux-dash-master/* /var/www/linuxdash rm -R linux-dash-master fi #PIHOLE INSTALLING_INDEX=93 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://install.pi-hole.net' G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Pre-reqs: https://github.com/Fourdee/DietPi/issues/1282#issuecomment-350490524 G_AGI "$PHP_APT_PACKAGE_NAME"-cgi "$PHP_APT_PACKAGE_NAME"-sqlite* # - Check free available memory. Increase swapfile size to prevent gravity running out of mem. if (( $(free -m | grep -m1 'Mem:' | awk '{print $4}') < 512 )); then if [ -f /etc/dphys-swapfile ] && (( $(grep 'CONF_SWAPSIZE=' /etc/dphys-swapfile | 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 fi fi # NB: PiHole currently replaces the lighttpd.conf file entirly and restricts webserver use to PiHole only. We dont want a limited webserver dedicated to PiHole, so lets avoid it. mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.bak &> /dev/null # - Install wget "$INSTALL_URL_ADDRESS" -O install.sh chmod +x install.sh ./install.sh local exit_code=$? if (( $exit_code != 0 )); then G_DIETPI-NOTIFY 1 "Pi-Hole exited with code ($exit_code) and is not installed." aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]=0 fi mv /etc/lighttpd/lighttpd.conf.bak /etc/lighttpd/lighttpd.conf &> /dev/null fi #SUBSONIC 5 INSTALLING_INDEX=33 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://sourceforge.net/projects/subsonic/files/subsonic/5.3/subsonic-5.3.deb/download' G_CHECK_URL "$INSTALL_URL_ADDRESS" #G_AGI lame #conflicts with our ffmpeg package: https://github.com/Fourdee/DietPi/issues/946#issuecomment-300738228 #Install SubSonic 5.3 wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi #SUBSONIC 6 INSTALLING_INDEX=34 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://sourceforge.net/projects/subsonic/files/subsonic/6.1.3/subsonic-6.1.3.deb/download' G_CHECK_URL "$INSTALL_URL_ADDRESS" #G_AGI lame #conflicts with our ffmpeg package: https://github.com/Fourdee/DietPi/issues/946#issuecomment-300738228 #Install SubSonic 6.0 wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi #WEAVED INSTALLING_INDEX=68 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/weaved/installer/raw/master/Raspbian%20deb/1.3-07/weavedconnectd_1.3-07v_armhf.deb' G_CHECK_URL "$INSTALL_URL_ADDRESS" #Install WEAVED wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi #WEBIOPI requires RPIGPIO if (( ${aSOFTWARE_INSTALL_STATE[71]} == 1 )); then aSOFTWARE_INSTALL_STATE[69]=1 fi #RPIGPIO INSTALLING_INDEX=69 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # >= v111 image if [ -f /etc/.dietpi_image_version ]; then G_AGI python-rpi.gpio python3-rpi.gpio # - < v111 Bug in older DietPi images with sources.list | Use pip, as offical repo = python3-rpi.gpio: Depends: python3 (< 3.3) but 3.4.2-2 is to be installed else G_AGI python3-pip pip3 install RPi.GPIO fi fi #WIRINGPI INSTALLING_INDEX=70 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - RPi if (( $G_HW_MODEL < 10 )); then # http://git.drogon.net/?p=wiringPi;a=shortlog;h=refs/heads/master snapshot INSTALL_URL_ADDRESS='http://git.drogon.net/?p=wiringPi;a=snapshot;h=HEAD;sf=tgz' # - Odroid's elif (( $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 )); then INSTALL_URL_ADDRESS='https://github.com/hardkernel/wiringPi/archive/master.zip' # - BPiPro elif (( $G_HW_MODEL == 51 )); then INSTALL_URL_ADDRESS='https://github.com/LeMaker/WiringBP/archive/bananapro.zip' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" # - RPi if (( $G_HW_MODEL < 10 )); then wget "$INSTALL_URL_ADDRESS" -O package.tar tar xfz package.tar rm package.tar # - Odroid's / BPI else wget "$INSTALL_URL_ADDRESS" -O package.zip unzip package.zip rm package.zip fi if (( $G_HW_MODEL == 51 )); then mv WiringBP* wiringPi fi cd wiringPi* chmod +x build ./build cd "$HOME" #rm -R /root/wiringPi* #Also Contains example code for users. fi #RPII2C INSTALLING_INDEX=72 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing /DietPi/dietpi/func/dietpi-set_hardware i2c enable fi #nodered INSTALLING_INDEX=122 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI python python3 # - RPi, pre-reqs GPIO control for Node-Red if (( $G_HW_MODEL < 10 )); then G_AGI python-rpi.gpio fi # - Serialport fails to build unless below flags are provided npm install -g node-red --unsafe-perm fi #mosquitto INSTALLING_INDEX=123 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing if (( $G_DISTRO > 4 )); then # On Buster, we can use current APT package from Debian repo G_AGI mosquitto else # - ARMv8 if (( $G_HW_ARCH == 3 )); then dpkg --add-architecture armhf G_AGUP fi #Pre-Req # - libssl1.0.0 no longer available: https://github.com/Fourdee/DietPi/issues/1299 INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/' # - ARMv6/7/8 if (( $G_HW_ARCH >= 1 && $G_HW_ARCH <= 3 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_armhf.deb' # - x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/mosquitto_1.4.14-0mosquitto1_nows1_armhf.deb' if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/mosquitto_1.4.14-0mosquitto1_nows1_amd64.deb' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb #Install deb # Allow error, so we can install additional required packages automatically dpkg -i package.deb G_AGF rm package.deb fi fi #Blynk Server INSTALLING_INDEX=131 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Binary URL fails connection test, so we need to parent back a little: https://github.com/Fourdee/DietPi/issues/445#issuecomment-283400449 INSTALL_URL_ADDRESS='https://github.com/blynkkk/blynk-server/releases' G_CHECK_URL "$INSTALL_URL_ADDRESS" mkdir -p /etc/blynkserver INSTALL_URL_ADDRESS='https://github.com/blynkkk/blynk-server/releases/download/v0.29.7/server-0.29.7-java8.jar' wget "$INSTALL_URL_ADDRESS" -O /etc/blynkserver/server.jar # - Install Blynk JS Libary G_AGI python npm install -g onoff npm install -g blynk-library fi #NAA Daemon INSTALLING_INDEX=124 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - Skip license for NAA daemon if needed: if (( ! $G_USER_INPUTS )); then debconf-set-selections <<< "networkaudiod networkaudiod/license note false" fi #Packages local apackages=() # Jessie - requires stretch packages if (( $G_DISTRO == 3 )); then apackages+=('http://dietpi.com/downloads/binaries/all/gcc-6-base_6.3.0-6_armhf.deb') apackages+=('http://dietpi.com/downloads/binaries/all/libstdc++6_6.3.0-6_armhf.deb') fi apackages+=('https://www.signalyst.eu/bins/naa/linux/stretch/networkaudiod_3.5.2-36_armhf.deb') # - check online for ((i=0; i<${#apackages[@]}; i++)) do INSTALL_URL_ADDRESS="${apackages[$i]}" G_CHECK_URL "$INSTALL_URL_ADDRESS" done # - Prereqs G_AGI libasound2 # - Stretch, install additional packages if (( $G_DISTRO >= 4 )); then G_AGI gcc-6-base libstdc++6 fi for ((i=0; i<${#apackages[@]}; i++)) do wget "${apackages[$i]}" -O package.deb dpkg -i package.deb rm package.deb done unset apackages #Enable logging for NAA Daemon #echo -e "NETWORKAUDIOD_LOGFILE='/var/log/naadaemon.log'" > /etc/default/networkaudiod fi #Tomcat8 INSTALLING_INDEX=125 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI tomcat8 fi #WEBIOPI INSTALLING_INDEX=71 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://sourceforge.net/projects/webiopi/files/WebIOPi-0.7.1.tar.gz/download' G_CHECK_URL "$INSTALL_URL_ADDRESS" #Python dev, pre-reqs G_AGI python-dev python-setuptools --no-install-recommends #Install WEBIOPI wget "$INSTALL_URL_ADDRESS" -O package.tar tar xvzf package.tar rm package.tar cd WebIOPi* #Automate Weaved prompt sed -i '/read response/c\response="n"' setup.sh #Run setup script ./setup.sh clear cd .. #Cleanup rm -R WebIOPi* fi #DIETPICLOUDSHELL INSTALLING_INDEX=62 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #LCD panels can be enabled in Dietpi-config > display options # XU4 enable cloudshell if (( $G_HW_MODEL == 11 )); then /DietPi/dietpi/func/dietpi-set_hardware lcdpanel odroid-cloudshell fi fi #HAPROXY INSTALLING_INDEX=98 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://www.haproxy.org/download/1.8/src/haproxy-1.8.2.tar.gz' G_CHECK_URL "$INSTALL_URL_ADDRESS" #Download HAPROXY wget "$INSTALL_URL_ADDRESS" -O package.tar tar -xvf package.tar rm package.tar cd haproxy-* #Pre-reqs G_AGI libpcre3-dev libssl-dev zlib1g-dev #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 cd .. #Clean up rm -R haproxy-* #Install init script as service cp /DietPi/dietpi/conf/haproxy_init /etc/init.d/haproxy chmod +x /etc/init.d/haproxy update-rc.d haproxy defaults fi #SQUEEZEBOXSERVER INSTALLING_INDEX=35 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Stretch if (( $G_DISTRO >= 4 )); then #Untested ARMv8 if (( $G_HW_ARCH == 3 )); then dpkg --add-architecture armhf G_AGUP fi INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/logitechmediaserver_7.9.1_armv7-(stretch).deb' wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb G_AGF else INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/logitechmediaserver_7.9.0_all.deb' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb #https://github.com/Fourdee/DietPi/issues/736 G_AGF #Stop service service logitechmediaserver stop # + ARMv6 cpan if (( $G_HW_ARCH == 1 )); then wget http://dietpi.com/downloads/binaries/all/logitechmediaserver_7.9.0_CPAN_5.20_armv6hf.tar.gz -O package.tar tar xvzf package.tar -C / rm package.tar # + ARM64 cpan elif (( $G_HW_ARCH == 3 )); then G_AGI libxml-parser-perl G_AGI zlib1g-dev libjpeg-dev libpng-dev libjpeg62-turbo-dev # shared libs needed for Image::Scale@0.08 wget http://dietpi.com/downloads/binaries/all/DietPi-LMS7.9-CPAN_arm64.zip -O package.zip unzip -o package.zip -d /usr/share/squeezeboxserver rm package.zip fi fi fi #WORDPRESS INSTALLING_INDEX=55 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://wordpress.org/latest.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /var/www/ rm package.zip fi #TIGHTVNCSERVER INSTALLING_INDEX=27 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI tightvncserver x11vnc --no-install-recommends fi #VNC4SERVER INSTALLING_INDEX=28 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI vnc4server x11vnc --no-install-recommends # - Stretch+ if (( $G_DISTRO >= 4 )); then G_AGI tigervnc-common fi fi #REALVNCSERVER INSTALLING_INDEX=120 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # INSTALL_URL_ADDRESS='https://www.realvnc.com/download/binary/latest/debian/arm/' # G_CHECK_URL "$INSTALL_URL_ADDRESS" # wget "$INSTALL_URL_ADDRESS" -O package.tar.gz # tar xvf package.tar.gz # rm package.tar.gz # dpkg -i VNC*.deb # rm VNC*.deb # - Available in Raspbian apt G_AGI realvnc-vnc-server fi #FAIL2BAN INSTALLING_INDEX=73 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing touch /var/log/auth.log #: https://github.com/Fourdee/DietPi/issues/475#issuecomment-310873879 G_AGI fail2ban --no-install-recommends fi #PHPSYSINFO INSTALLING_INDEX=64 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/phpsysinfo/phpsysinfo/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /var/www/ rm package.zip mv /var/www/phpsysinfo-* /var/www/phpsysinfo fi #PHPIMAGEGALLERY INSTALLING_INDEX=56 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/Single_File_PHP_Gallery_4.6.1.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /var/www/gallery rm package.zip fi #AMPACHE INSTALLING_INDEX=40 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/ampache/ampache/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip mv ampache-* /var/www/ampache #composer install required for 3.8.2 php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php php composer-setup.php php -r "unlink('composer-setup.php');" mv composer.phar /usr/local/bin/composer cd /var/www/ampache composer install --prefer-source --no-interaction cd "$HOME" fi #OPENVPNSERVER INSTALLING_INDEX=97 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI openvpn easy-rsa iptables fi #PiVPN INSTALLING_INDEX=117 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://install.pivpn.io' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI lsb-release # - Requires underpriv user: https://github.com/Fourdee/DietPi/issues/570#issuecomment-255588307 useradd pivpn mkdir -p /home/pivpn while true do wget "$INSTALL_URL_ADDRESS" -O pivpn_install.sh chmod +x pivpn_install.sh # - Disable reboot sed -i '/shutdown[[:space:]]/d' pivpn_install.sh ./pivpn_install.sh if (( $? != 0 )); then whiptail --title "PiVPN failed/aborted" --yesno "The PiVPN installer was not successful and/or canceled prior to its completion.\n\nWould you like DietPi to run the PiVPN installer again?" --backtitle "$WHIP_BACKTITLE" --defaultno 12 70 if (( $? != 0 )); then aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]=0 break fi else rm pivpn_install.sh break fi done fi #LETSENCRYPT INSTALLING_INDEX=92 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing if (( $G_DISTRO >= 4 )); then G_AGI certbot if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then G_AGI python-certbot-apache fi if (( ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then G_AGI python-certbot-nginx fi else INSTALL_URL_ADDRESS='https://github.com/certbot/certbot/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /root rm package.zip mv certbot* /etc/certbot_scripts # - Install packages cd /etc/certbot_scripts ./certbot-auto -n --os-packages-only cd ~/ fi fi #TORHOTSPOT requires WIFIHOTSPOT: if (( ${aSOFTWARE_INSTALL_STATE[61]} == 1 )); then aSOFTWARE_INSTALL_STATE[60]=1 fi #WIFIHOTSPOT INSTALLING_INDEX=60 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/hostapd_2.5_all.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Prereqs G_AGI hostapd isc-dhcp-server iptables libnl-3-200 wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip # - Check for RTL8188C* device, use the patched binary I compiled: https://github.com/pritambaral/hostapd-rtl871xdrv#why if (( $(lsusb | grep -ci -m1 'RTL8188C') || $G_HW_MODEL == 70 )); then #Force RTL for allo provided WiFi dongle WIFIHOTSPOT_RTL8188C_DEVICE=1 fi #Which binary to install local filename_hostapd='' local filename_hostapd_cli='' # - armv6 if (( $G_HW_ARCH == 1 )); then filename_hostapd='hostapd-nl80211-armv6' filename_hostapd_cli='hostapd_cli-armv6' if (( $WIFIHOTSPOT_RTL8188C_DEVICE )); then filename_hostapd='hostapd-rtl8188c-armv6' fi # - armv7+ elif (( $G_HW_ARCH == 2 )); then filename_hostapd='hostapd-nl80211-armv7' filename_hostapd_cli='hostapd_cli-armv7' if (( $WIFIHOTSPOT_RTL8188C_DEVICE )); then filename_hostapd='hostapd-rtl8188c-armv7' fi # - arm64 elif (( $G_HW_ARCH == 3 )); then filename_hostapd='hostapd-nl80211-arm64' filename_hostapd_cli='hostapd_cli-arm64' if (( $WIFIHOTSPOT_RTL8188C_DEVICE )); then filename_hostapd='hostapd-rtl8188c-arm64' fi fi mv "$filename_hostapd" /usr/sbin/hostapd mv "$filename_hostapd_cli" /usr/sbin/hostapd_cli chmod +x /usr/sbin/hostapd chmod +x /usr/sbin/hostapd_cli rm hostapd-* #Enable wifi modules /DietPi/dietpi/func/dietpi-set_hardware wifimodules enable # - Stretch, libssl1.0.0 no longer available: https://github.com/Fourdee/DietPi/issues/1299 # Possibly only needed for RPi, however, no harm in installing, cover all bases. if (( $G_DISTRO >= 4 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/' # - ARMv6/7 if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_armhf.deb' # - ARM64 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_arm64.deb' # - x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi fi #TORHOTSPOT INSTALLING_INDEX=61 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - Prereqs G_AGI tor fi #SHAIRPORTSYNC INSTALLING_INDEX=37 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/shairport-sync_3.1.3_' # - ARMv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS+='armv6.7z' # - ARMv7 elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='armv7.7z' # - ARM64 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='arm64.7z' # - x86_64 # elif (( $G_HW_ARCH == 10 )); then # INSTALL_URL_ADDRESS+='amd64.7z' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Prereqs G_AGI openssl libsoxr0 libavahi-client3 libtool libconfig9 libpopt0 libdaemon0 --no-install-recommends # This occured on C2: shairport-sync : Depends: libpopt-dev but it is not installed #G_AGI libpopt-dev wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z -o/ rm package.7z # - Stretch, libssl1.0.0 no longer available if (( $G_DISTRO >= 4 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/' # - ARMv6/7 if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_armhf.deb' # - ARM64 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_arm64.deb' # - x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi fi #BRUTEFIR INSTALLING_INDEX=38 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check folder is online INSTALL_URL_ADDRESS='http://dietpi.com/downloads/conf/BruteFIR/' G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Prereqs G_AGI brutefir wget -r -nH --cut-dirs=2 --no-parent --reject="index.htm*" -e robots=off "$INSTALL_URL_ADDRESS" mv BruteFIR /etc/ fi #PYDIO INSTALLING_INDEX=48 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check folder is online INSTALL_URL_ADDRESS='https://download.pydio.com/pub/core/archives/pydio-core-8.0.2.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /var/www mv /var/www/pydio-core-* /var/www/pydio rm package.zip fi #SQUEEZELITE INSTALLING_INDEX=36 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/squeezelite-1.8_all.7z' G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Prereqs G_AGI squeezelite # - Overwrite binary with latest version: wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z -o/usr/bin rm package.7z rm /usr/bin/squeezelite local target_binary='' if (( $G_HW_ARCH == 1 )); then target_binary='squeezelite_armv6' # - ARMv7 elif (( $G_HW_ARCH == 2 )); then target_binary='squeezelite_armv7' # - ARM64 elif (( $G_HW_ARCH == 3 )); then target_binary='squeezelite_arm64' # - x86_64 elif (( $G_HW_ARCH == 10 )); then target_binary='squeezelite_amd64' fi ln -sf /usr/bin/"$target_binary" /usr/bin/squeezelite chmod +x /usr/bin/squeezelite fi #EMONHUB INSTALLING_INDEX=99 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check, is online INSTALL_URL_ADDRESS='https://github.com/Fourdee/emonhub/archive/emon-pi.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Prereqs G_AGI minicom python-serial python-configobj --no-install-recommends pip install paho-mqtt pydispatcher wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip # - move everything to /etc/emonhub rm -R /etc/emonhub mkdir -p /etc/emonhub mv emonhub-*/* /etc/emonhub/ rm -R emonhub-* fi #RPIMONITOR INSTALLING_INDEX=66 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check, is online INSTALL_URL_ADDRESS='https://github.com/XavierBerger/RPi-Monitor-deb/raw/master/packages/rpimonitor_2.12-r0_all.deb' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb # - Prereqs apt-get -f -y install fi #NETDATA INSTALLING_INDEX=65 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/netdata_1.6.0_' #armv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS+='armv6.deb' #armv7+ elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='armv7.deb' #ARMv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='arm64.deb' #amd64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='amd64.deb' fi #check, is online G_CHECK_URL "$INSTALL_URL_ADDRESS" # - For compression G_AGI --no-install-recommends zlib1g-dev wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi #BAIKAL INSTALLING_INDEX=57 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check folder is online INSTALL_URL_ADDRESS='https://github.com/fruux/Baikal/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip -d /var/www rm package.zip mv /var/www/Baikal* /var/www/baikal fi #MUMBLESERVER INSTALLING_INDEX=43 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI mumble-server fi #EMBYSERVER INSTALLING_INDEX=41 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #ARM packages only available in 14.04 repo: https://github.com/Fourdee/DietPi/issues/1059#issuecomment-313661959 INSTALL_URL_ADDRESS='http://download.opensuse.org/repositories/home:/emby/xUbuntu_14.04/' # x86_64, use Debian repos if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='http://download.opensuse.org/repositories/home:/emby/Debian_' if (( $G_DISTRO == 3 )); then INSTALL_URL_ADDRESS+='8.0' elif (( $G_DISTRO == 4 )); then INSTALL_URL_ADDRESS+='9.0' elif (( $G_DISTRO == 5 )); then # http://download.opensuse.org/repositories/home:/emby/Debian_Next/ INSTALL_URL_ADDRESS+='Next' fi INSTALL_URL_ADDRESS+='/' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" echo -e "deb $INSTALL_URL_ADDRESS /" > /etc/apt/sources.list.d/emby-server.list wget "$INSTALL_URL_ADDRESS"Release.key apt-key add - < Release.key rm Release.key G_AGUP #ARMv7, Grab required pre-reqs from various sources: https://github.com/Fourdee/DietPi/issues/1128#issuecomment-326743471 / https://github.com/Fourdee/DietPi/issues/1150#issuecomment-330291298 if (( $G_HW_ARCH == 2 )); then wget http://ftp.us.debian.org/debian/pool/main/libj/libjpeg8/libjpeg8_8d-1+deb7u1_armhf.deb -O package.deb dpkg -i package.deb rm package.deb wget http://ftp.us.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_armhf.deb -O package.deb dpkg -i package.deb rm package.deb wget http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp5_0.4.1-1.2+b2_armhf.deb -O package.deb dpkg -i package.deb rm package.deb #ARMv8 elif (( $G_HW_ARCH == 3 )); then wget http://ftp.us.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_arm64.deb -O package.deb dpkg -i package.deb rm package.deb wget http://ftp.us.debian.org/debian/pool/main/libw/libwebp/libwebp5_0.4.1-1.2+b2_arm64.deb -O package.deb dpkg -i package.deb rm package.deb wget https://mirror.i-novus.ru/ubuntu-ports/pool/main/libj/libjpeg-turbo/libjpeg-turbo8_1.3.0-0ubuntu2_arm64.deb -O package.deb dpkg -i package.deb rm package.deb wget http://turul.canonical.com/pool/main/libj/libjpeg8-empty/libjpeg8_8c-2ubuntu8_arm64.deb -O package.deb dpkg -i package.deb rm package.deb fi G_AGI emby-server embymagick fi #PLEXMEDIASERVER INSTALLING_INDEX=42 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check folder is online #x86_64 if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='https://downloads.plex.tv/plex-media-server/1.10.1.4602-f54242b6b/plexmediaserver_1.10.1.4602-f54242b6b_amd64.deb' #ARM else INSTALL_URL_ADDRESS='http://dev2day.de/pms/' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" #x86_64 if (( $G_HW_ARCH == 10 )); then wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb #ARM else echo -e "deb [arch=armhf] $INSTALL_URL_ADDRESS $G_DISTRO_NAME main" > /etc/apt/sources.list.d/plex.list wget -O - "$INSTALL_URL_ADDRESS"dev2day-pms.gpg.key | apt-key add - G_AGUP #ARMv8: Install 32bit binaries if (( $G_HW_ARCH == 3 )); then dpkg --add-architecture armhf G_AGUP G_AGI binutils:armhf plexmediaserver-installer:armhf #ARM32 else G_AGI plexmediaserver-installer fi fi fi #CUBERITE INSTALLING_INDEX=52 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #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' #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' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.tar mkdir -p /etc/cubrite tar xzvf package.tar -C /etc/cubrite rm package.tar # - Move everything into base directory (cuberite) mv /etc/cubrite/Server/* /etc/cubrite/ rm -R /etc/cuberite/Server fi #MINEOS INSTALLING_INDEX=53 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check folder is online INSTALL_URL_ADDRESS='https://github.com/hexparrot/mineos-node.git' G_CHECK_URL "$INSTALL_URL_ADDRESS" #prereqs G_AGI python python3 supervisor rdiff-backup screen rsync mkdir -p "$G_FP_DIETPI_USERDATA"/mineos cd "$G_FP_DIETPI_USERDATA"/mineos git clone https://github.com/hexparrot/mineos-node.git minecraft cd minecraft git config core.filemode false chmod +x service.js mineos_console.js generate-sslcert.sh webui.js npm install cd "$HOME" fi #GOGS INSTALLING_INDEX=49 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/gogs_' #armv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS+='armv6.zip' #armv7+ elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='armv7.zip' #x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='amd64.zip' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip mv gogs* /etc/gogs fi #QBITTORRENT INSTALLING_INDEX=46 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI qbittorrent-nox fi #RTORRENT INSTALLING_INDEX=107 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://bintray.com/novik65/generic/download_file?file_path=ruTorrent-3.7.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI rtorrent screen #mediainfo #Raspbian unrar free if (( $G_HW_MODEL < 10 )); then G_AGI unrar-free #https://github.com/Fourdee/DietPi/issues/176#issuecomment-240101365 else G_AGI unrar #https://github.com/Fourdee/DietPi/issues/176#issuecomment-240101365 fi wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip mkdir -p /var/www/rutorrent mv ruTorrent-*/* /var/www/rutorrent/ rm -R ruTorrent-* fi #Aria2 INSTALLING_INDEX=132 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing if (( $G_DISTRO >= 4 )); then G_AGI aria2 else #aria2 binary INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/aria2_' # - armv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS+='armv6.7z' # - armv7+ elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='armv7.7z' # - arm64 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='arm64.7z' # - x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='x86_64.7z' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" # - prereqs G_AGI libc-ares2 wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z rm package.7z mv aria2_* /usr/local/bin/aria2c chmod +x /usr/local/bin/aria2c fi #Web interface INSTALL_URL_ADDRESS='https://github.com/ziahamza/webui-aria2/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip cp -R webui-aria2* /var/www/aria2 rm -R webui-aria2* fi #SICKRAGE INSTALLING_INDEX=116 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/SickRage/SickRage/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI python libxslt1.1 libxml2 python-openssl python-xmltodict #Raspbian unrar free if (( $G_HW_MODEL < 10 )); then G_AGI unrar-free else G_AGI unrar fi wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip mkdir -p /etc/sickrage mv SickRage-*/* /etc/sickrage/ rm -R SickRage-* fi #SYNCTHING INSTALLING_INDEX=50 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # - armv6+ if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS='https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-arm-v0.14.42.tar.gz' # - arm64 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-arm64-v0.14.42.tar.gz' # - x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-amd64-v0.14.42.tar.gz' fi #?? #For some reason checking connection (spider) against the files above fails. #G_CHECK_URL "$INSTALL_URL_ADDRESS" G_CHECK_URL https://github.com/syncthing/syncthing wget "$INSTALL_URL_ADDRESS" -O package.tar tar xzvf package.tar rm package.tar mkdir -p /etc/syncthing cp -R syncthing-*/syncthing /etc/syncthing/ rm -R syncthing-* fi #TONIDO INSTALLING_INDEX=134 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing ### Pre-reqs ## libjpeg8, libpng12, libssl1.0.0 # https://github.com/Fourdee/DietPi/issues/1428#issuecomment-361099496 # - armv6/7 if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS1='http://dietpi.com/downloads/binaries/all/libjpeg8_8d1-2_armhf.deb' (( $G_DISTRO > 3 )) && INSTALL_URL_ADDRESS2='http://dietpi.com/downloads/binaries/all/libssl1.0.0_1.0.2l-1_bpo8+1_armhf.deb' G_AGI libpng12-0 # - x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS1='http://dietpi.com/downloads/binaries/all/libjpeg8_8d1-2_amd64.deb' (( $G_DISTRO > 3 )) && INSTALL_URL_ADDRESS2='http://dietpi.com/downloads/binaries/all/libpng12-0_1.2.50-2+deb8u3_amd64.deb' || AGI libpng12-0 fi G_CHECK_URL "$INSTALL_URL_ADDRESS1" wget "$INSTALL_URL_ADDRESS1" -O package.deb dpkg -i package.deb rm package.deb if (( $G_DISTRO > 3 )); then G_CHECK_URL "$INSTALL_URL_ADDRESS2" wget "$INSTALL_URL_ADDRESS2" -O package.deb dpkg -i package.deb rm package.deb fi ## libfontconfig1 G_AGI libfontconfig1 ### Tonido # - armv6+ if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS='http://patch.codelathe.com/tonido/live/installer/armv6l-rpi/tonido.tar.gz' # - x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='http://www.tonido.com/download.php?tonido64.tar.gz' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.tar mkdir /etc/tonido tar xvf package.tar -C /etc/tonido rm package.tar fi #CHROMIUM INSTALLING_INDEX=113 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Stretch via apt if (( $G_DISTRO >= 4 )); then if (( $G_HW_MODEL < 10 )); then G_AGI chromium-browser else G_AGI chromium fi else #armv6+ if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/chromium_52.0.2743.116-1-deb8u1.1_armhf.deb' #ARMv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/chromium_52.0.2743.116-1-deb8u1.1_arm64.deb' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb # - Odroid's, 'apt-get install -f' removes chromium package, rather than install required deps... if (( $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 )); then G_AGI libgnome-keyring0 libnspr4 libnss3 libnss3-1d libspeechd2 libxslt1.1 libxss1 xdg-utils libgnome-keyring-common libltdl7 else G_AGF fi wget http://dietpi.com/downloads/binaries/all/chromium-l10n_52.0.2743.116-1-deb8u1.1_all.deb -O package.deb dpkg -i package.deb # armv6+ if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then wget http://dietpi.com/downloads/binaries/all/chromedriver_52.0.2743.116-1-deb8u1.1_armhf.deb -O package.deb dpkg -i package.deb # arm64 elif (( $G_HW_ARCH == 3 )); then wget http://dietpi.com/downloads/binaries/all/chromedriver_52.0.2743.116-1-deb8u1.1_arm64.deb -O package.deb dpkg -i package.deb fi rm package.deb # - Prevent Debian repo from replacing our chromium packages: https://github.com/Fourdee/DietPi/issues/658 apt-mark hold chromium chromedriver fi fi #MotionEye INSTALLING_INDEX=136 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Jessie, prefer latest motion release. if (( $G_DISTRO == 3 )); then INSTALL_URL_ADDRESS='https://github.com/Motion-Project/motion/releases/download/release-4.1.1/pi_jessie_motion_4.1.1-1_armhf.deb' #url/redireect always fails wget spider test... G_CHECK_URL "http://github.com/Motion-Project/motion" # - Prereqs G_AGI v4l-utils python python-dev curl libssl-dev libcurl4-openssl-dev libjpeg-dev zlib1g-dev libx264-142 libavcodec56 libavformat56 libmysqlclient18 libswscale3 libpq5 # - Motion wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb # - Motioneye pip install motioneye #Stretch else # - Prereqs G_AGI v4l-utils python python-dev curl libssl-dev libcurl4-openssl-dev libjpeg-dev zlib1g-dev G_AGI motion # - Motioneye pip install motioneye fi fi #CloudPrint INSTALLING_INDEX=137 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing if (( $G_DISTRO == 3 )); then #https://github.com/Fourdee/DietPi/issues/855#issuecomment-292712002 INSTALL_URL_ADDRESS='http://davesteele.github.io/cloudprint-service' #url/redirect fails wget spider test... G_CHECK_URL "$INSTALL_URL_ADDRESS" INSTALL_URL_ADDRESS+='/repo' 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 - G_AGUP G_AGI cloudprint-service else G_AGI cloudprint-service fi fi #VirtualHere INSTALLING_INDEX=138 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://virtualhere.com/sites/default/files/usbserver/vhusbd' #armv6+ if (( $G_HW_ARCH == 1 || $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='arm' #ARMv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='arm64' #x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='x86_64' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" mkdir -p /etc/vhusbd wget "$INSTALL_URL_ADDRESS" -O /etc/vhusbd/vhusbd chmod +x /etc/vhusbd/vhusbd fi #sabnzbd INSTALLING_INDEX=139 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing local version='2.3.2' INSTALL_URL_ADDRESS="https://github.com/sabnzbd/sabnzbd/archive/$version.zip" G_CHECK_URL "$INSTALL_URL_ADDRESS" #prereqs G_AGI par2 python-dev libffi-dev libssl-dev if (( $G_HW_MODEL < 10 )); then G_AGI unrar-free else G_AGI unrar fi wget "$INSTALL_URL_ADDRESS" -O package.zip mkdir -p /etc/sabnzbd unzip -o package.zip -d /etc/sabnzbd rm package.zip mv /etc/sabnzbd/sabnzbd-"$version"/* /etc/sabnzbd/ rm -R /etc/sabnzbd/sabnzbd-"$version" pip install cheetah cryptography sabyenc fi #spotifyconnectweb INSTALLING_INDEX=141 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/Fornoth/spotify-connect-web/releases' #full path fails wget spider test... G_CHECK_URL "$INSTALL_URL_ADDRESS" INSTALL_URL_ADDRESS+='/download/0.0.3-alpha/spotify-connect-web_0.0.3-alpha.tar.gz' wget "$INSTALL_URL_ADDRESS" -O package.tar tar zxvf package.tar -C "$G_FP_DIETPI_USERDATA"/ rm package.tar fi #couchpotato INSTALLING_INDEX=142 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/CouchPotato/CouchPotatoServer/archive/master.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI libffi-dev libssl-dev python-lxml python3-lxml wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip rm -R /etc/couchpotato &> /dev/null mv CouchPotato* /etc/couchpotato pip install --upgrade pyopenssl fi #Koel INSTALLING_INDEX=143 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/phanan/koel/archive/v3.7.0.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI python wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip rm package.zip mv koel-* /var/www/koel php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php php composer-setup.php php -r "unlink('composer-setup.php');" mv composer.phar /usr/local/bin/composer cd /var/www/koel npm install yarn -g --unsafe-perm composer install npm install cd "$HOME" fi #Sonarr INSTALLING_INDEX=144 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC if (( $G_HW_ARCH == 3 )); then echo -e "deb [arch=armhf] https://apt.sonarr.tv/ master main" > /etc/apt/sources.list.d/sonarr.list dpkg --add-architecture armhf else echo -e "deb https://apt.sonarr.tv/ master main" > /etc/apt/sources.list.d/sonarr.list fi G_AGUP G_AGI nzbdrone fi #Radarr INSTALLING_INDEX=145 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://api.github.com/repos/Radarr/Radarr/releases' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI mono-devel mediainfo sqlite3 libmono-cil-dev wget $( curl -s "$INSTALL_URL_ADDRESS" | grep linux.tar.gz | grep browser_download_url | head -1 | cut -d \" -f 4 ) -O package.tar tar -xf package.tar -C /opt/ rm package.tar fi #PlexPy INSTALLING_INDEX=146 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/JonnyWong16/plexpy.git' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI python git clone --depth=1 "$INSTALL_URL_ADDRESS" mv plexpy /opt/ fi #Jackett INSTALLING_INDEX=147 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://api.github.com/repos/Jackett/Jackett/releases' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI mono-devel wget $( curl -s "$INSTALL_URL_ADDRESS" | grep Jackett.Binaries.Mono.tar.gz | grep browser_download_url | head -1 | cut -d \" -f 4 ) -O package.tar tar -xvf package.tar rm package.tar mkdir /opt/jackett mv Jackett/* /opt/jackett rm -R Jackett fi #JRiver INSTALLING_INDEX=148 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dist.jriver.com/latest/mediacenter/mediacenter22native.list' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget -q -O - http://dist.jriver.com/mediacenter@jriver.com.gpg.key | apt-key add - wget "$INSTALL_URL_ADDRESS" -O /etc/apt/sources.list.d/mediacenter22.list G_AGUP G_AGI mediacenter22 fi #NZBget INSTALLING_INDEX=149 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://nzbget.net' G_CHECK_URL "$INSTALL_URL_ADDRESS" INSTALL_URL_ADDRESS+='/download/nzbget-latest-bin-linux.run' wget "$INSTALL_URL_ADDRESS" -O package.run mkdir -p "$G_FP_DIETPI_USERDATA"/nzbget sh package.run --destdir "$G_FP_DIETPI_USERDATA"/nzbget rm package.run fi #------------------ Bittorrent: HTPC Manager ------------------ INSTALLING_INDEX=155 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/Hellowlol/HTPC-Manager.git' G_CHECK_URL "$INSTALL_URL_ADDRESS" #Install Python and PIP G_AGI python python-pip python-imaging python-dev cd "$HOME" git clone --depth=1 "$INSTALL_URL_ADDRESS" # - Move HTPC Manager to a 'better' location mkdir -p "$G_FP_DIETPI_USERDATA"/htpc-manager mv "$HOME"/HTPC-Manager/* "$G_FP_DIETPI_USERDATA"/htpc-manager/ rm -R "$HOME"/HTPC-Manager # - psutil for system stats pip install psutil fi #OctoPrint INSTALLING_INDEX=153 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/foosel/OctoPrint.git' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI python python-dev git clone "$INSTALL_URL_ADDRESS" mv OctoPrint* "$G_FP_DIETPI_USERDATA"/octoprint cd "$G_FP_DIETPI_USERDATA"/octoprint python setup.py install cd "$HOME" fi #RoonServer INSTALLING_INDEX=154 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://download.roonlabs.com/builds/RoonServer_linuxx64.tar.bz2' G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI libav-tools cifs-utils wget "$INSTALL_URL_ADDRESS" -O package.tar tar xvf package.tar rm package.tar mv RoonServer "$G_FP_DIETPI_USERDATA"/roonserver fi #Steam INSTALLING_INDEX=156 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing debconf-set-selections <<< "steam steam/question select I AGREE" G_AGI steam fi #Minio INSTALLING_INDEX=158 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # Download the proper Minio executable and put it in the proper location # Check to see if this is a n x86 or x64 box. If so download the x86 Minio if not download 32bit ARM linux version if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='https://dl.minio.io/server/minio/release/linux-amd64/minio' else INSTALL_URL_ADDRESS='https://dl.minio.io/server/minio/release/linux-arm/minio' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" #Download executable wget -O /usr/local/bin/minio $INSTALL_URL_ADDRESS chmod +x /usr/local/bin/minio # Check, Download, Install startup script INSTALL_URL_ADDRESS='https://github.com/minio/minio-service/raw/master/linux-systemd/minio.service' G_CHECK_URL "$INSTALL_URL_ADDRESS" # Download the systemd service script wget -O /etc/systemd/system/minio.service $INSTALL_URL_ADDRESS # Create no login, with home directory, with group of same name, user to run Minio in adduser --system --group minio-user # Create default data directory & grant minio-user proper access mkdir "$G_FP_DIETPI_USERDATA"/minio-data fi #Docker INSTALLING_INDEX=162 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://get.docker.com' G_CHECK_URL "$INSTALL_URL_ADDRESS" # Offical Docker recommended install command wget -O DockerInstall.sh "$INSTALL_URL_ADDRESS" chmod +x DockerInstall.sh ./DockerInstall.sh #rm DockerInstall.sh fi #FuguHub INSTALLING_INDEX=161 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS='http://FuguHub.com/install/FuguHub.linux.install' else INSTALL_URL_ADDRESS='http://FuguHub.com/releases/raspberrypi/install.sh' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" wget -O FHinstall.sh "$INSTALL_URL_ADDRESS" chmod +x FHinstall.sh ./FHinstall.sh rm FHinstall.sh wget http://fuguhub.com/box.zip -O /home/bd/applications/box.zip fi #Nukkit INSTALLING_INDEX=164 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://ci.mengcraft.com:8080/job/nukkit/lastStableBuild/artifact/target/nukkit-1.0-SNAPSHOT.jar' G_CHECK_URL "$INSTALL_URL_ADDRESS" mkdir /usr/local/bin/nukkit wget -O /usr/local/bin/nukkit/nukkit.jar "$INSTALL_URL_ADDRESS" fi #GITEA INSTALLING_INDEX=165 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://dl.gitea.io/gitea/1.3.2/gitea-1.3.2-' #armv6 if (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS+='linux-arm-6' #armv7 elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='linux-arm-7' #armv8 elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='linux-arm64' #x86_64 elif (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='linux-amd64' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Data storage / user data mkdir -p "$G_FP_DIETPI_USERDATA"/gitea/gitea-repositories wget "$INSTALL_URL_ADDRESS" -O "$G_FP_DIETPI_USERDATA"/gitea/gitea chmod +x "$G_FP_DIETPI_USERDATA"/gitea/gitea fi #Allo Web Interface INSTALLING_INDEX=159 #160 for quick reinstall if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 || ${aSOFTWARE_INSTALL_STATE[160]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/allo_web_interface_v5.7z' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z -o/var/www/ rm package.7z fi #Gmediarender INSTALLING_INDEX=163 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/gmrender_1_' if (( $G_HW_ARCH == 10 )); then INSTALL_URL_ADDRESS+='amd64.deb' elif (( $G_HW_ARCH == 3 )); then INSTALL_URL_ADDRESS+='arm64.deb' elif (( $G_HW_ARCH == 2 )); then INSTALL_URL_ADDRESS+='armv7.deb' elif (( $G_HW_ARCH == 1 )); then INSTALL_URL_ADDRESS+='armv6.deb' fi G_CHECK_URL "$INSTALL_URL_ADDRESS" G_AGI libupnp6 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-alsa wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb fi #AudioPhonics Pi-SPC INSTALLING_INDEX=166 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #NB: Please see configuration section fi #Raspotify INSTALLING_INDEX=167 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://dtcooper.github.io/raspotify/key.asc' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget -O - "$INSTALL_URL_ADDRESS" | apt-key add - echo -e "deb https://dtcooper.github.io/raspotify jessie main" > /etc/apt/sources.list.d/raspotify.list G_AGUP G_AGI raspotify fi #moOde INSTALLING_INDEX=168 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/moode/rel-stretch-r40b9.zip' G_CHECK_URL "$INSTALL_URL_ADDRESS" cd "$HOME" wget "$INSTALL_URL_ADDRESS" -O package.zip unzip -o package.zip #Pre-Reqs ----------------------------------------------------------------------- # Core packages G_AGI rpi-update mpc memcached $PHP_APT_PACKAGE_NAME-memcache \ bs2b-ladspa libbs2b0 libasound2-plugin-equal telnet automake sysstat tcpdump shellinabox \ udisks-glue exfat-fuse inotify-tools libav-tools #php5-memcached # WiFi Hotspot G_AGI dnsmasq hostapd # BT G_AGI bluez bluez-firmware \ dh-autoreconf expect libortp-dev libbluetooth-dev libasound2-dev \ libusb-dev libglib2.0-dev libudev-dev libical-dev libreadline-dev libsbc1 libsbc-dev if (( $G_HW_MODEL < 10 )); then G_AGI pi-bluetooth fi #Disable Shell in box -------------------------------------------------------------------- systemctl stop shellinabox systemctl disable shellinabox #HostAPD/BT ------------------------------------------------------------------------------- systemctl disable hostapd systemctl disable dnsmasq cd "$HOME" git clone https://github.com/Arkq/bluez-alsa.git --depth=1 cd bluez-alsa autoreconf --install mkdir build cd build ../configure --disable-hcitop --with-alsaplugindir=/usr/lib/arm-linux-gnueabihf/alsa-lib make -j $(nproc --all) make install cd "$HOME" rm -rf bluez-alsa systemctl daemon-reload systemctl disable bluetooth.service systemctl disable bluealsa.service systemctl disable hciuart.service mkdir -p /var/run/bluealsa #Wiring Pi ------------------------------------------------------------------------------- #??? Use/test with DietPi WP install cd "$HOME" cp ./rel-stretch/other/wiringpi/wiringPi-*.tar.gz ./ tar xfz ./wiringPi-*.tar.gz cd wiringPi-96344ff ./build cd "$HOME" rm -rf ./wiringPi-* #Rotary encoder driver -------------------------------------------------------------------- cp ./rel-stretch/other/rotenc/rotenc.c ./ gcc -std=c99 rotenc.c -orotenc -lwiringPi cp ./rotenc /usr/local/bin rm ./rotenc* #Compile and install MPD ------------------------------------------------------------------ # Installed via DietPi pre-built binaries. fi #Google AIY INSTALLING_INDEX=169 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://github.com/google/aiyprojects-raspbian.git' G_CHECK_URL "$INSTALL_URL_ADDRESS" git clone -b voicekit "$INSTALL_URL_ADDRESS" "$G_FP_DIETPI_USERDATA"/voice-recognizer-raspi cd "$G_FP_DIETPI_USERDATA"/voice-recognizer-raspi pip3 install --upgrade pip virtualenv virtualenv --system-site-packages -p python3 env env/bin/pip install -r requirements.txt #??? ARMv7 only if (( $G_HW_ARCH == 2 )); then env/bin/pip install google-assistant-library==0.0.3 fi # - Services sed -i "s#/home/pi#$G_FP_DIETPI_USERDATA#g" systemd/voice-recognizer.service sed -i "/^User=/c\User=dietpi" systemd/voice-recognizer.service cp systemd/voice-recognizer.service /etc/systemd/system/ cp systemd/alsa-init.service /etc/systemd/system/ #cp systemd/ntpdate.service /etc/systemd/system/ source env/bin/activate # - Enable default app for service start cp src/assistant_library_with_button_demo.py src/main.py cd "$HOME" fi #------------------------------------------------------------------- #Reset error handler (eg: for usermsg clear set in Banner_Installing) G_ERROR_HANDLER_RESET #------------------------------------------------------------------- } Install_Linux_Software(){ INSTALLING_INDEX=5 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI alsa-utils #Apply soundcard local soundcard=$(cat /DietPi/dietpi.txt | grep -m1 '^CONFIG_SOUNDCARD=' | sed 's/.*=//') # - RPi enable internal HDMI+Analogue if currently set to 'none' if (( $G_HW_MODEL < 10 )) && [ "$soundcard" = "none" ] || [ "$soundcard" = "default" ]; then soundcard='rpi-bcm2835' fi # - Apply /DietPi/dietpi/func/dietpi-set_hardware soundcard "$soundcard" fi INSTALLING_INDEX=6 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Xserver Prereqs (ALL) G_AGI xcompmgr xterm xinit xauth xserver-xorg dbus-x11 xfonts-base x11-xserver-utils x11-common x11-utils --no-install-recommends #Improve performance on all desktops and devices (eg: removes window lag in desktops) by limiting compositions mkdir -p /etc/xdg/autostart cat << _EOF_ > /etc/xdg/autostart/xcompmgr.desktop [Desktop Entry] Type=Application Name=xcompmgr NoDisplay=true Exec=xcompmgr -a _EOF_ #RPI if (( $G_HW_MODEL < 10 )); then sleep 1 #Odroid C2 elif (( $G_HW_MODEL == 12 )); then G_AGI aml-libs-odroid mali450-odroid xf86-video-mali-odroid libump-odroid --no-install-recommends #cp /DietPi/dietpi/conf/xorg_c2.conf /etc/X11/xorg.conf # FBTURBO C2, provides much better desktop performance over Mali DDX: http://forum.odroid.com/viewtopic.php?f=138&t=19948&p=169808#p169808 G_AGI xf86-video-fbturbo-odroid cat << _EOF_ > /etc/X11/xorg.conf Section "Device" Identifier "FBTurbo" Driver "fbturbo" Option "fbdev" "/dev/fb0" Option "SwapbuffersWait" "true" #Option "Rotate" "CCW" EndSection _EOF_ #Odroid XU4 elif (( $G_HW_MODEL == 11 )); then G_AGI firmware-samsung xf86-video-armsoc-odroid malit628-odroid --no-install-recommends cp /DietPi/dietpi/conf/xorg_xu4.conf /etc/X11/xorg.conf #Odroid C1 elif (( $G_HW_MODEL == 10 )); then G_AGI aml-libs-odroid xf86-video-mali-odroid libump-odroid mali450-odroid --no-install-recommends cp /DietPi/dietpi/conf/xorg_c1.conf /etc/X11/xorg.conf #Pine64 elif (( $G_HW_MODEL == 40 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/all/libump_1-1_arm64.deb' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.deb dpkg -i package.deb rm package.deb wget http://dietpi.com/downloads/binaries/all/xf86-video-fbturbo_1-1_arm64.deb -O package.deb dpkg -i package.deb rm package.deb cat << _EOF_ > /etc/X11/xorg.conf Section "Device" Identifier "Allwinner A10/A13 FBDEV" Driver "fbturbo" Option "fbdev" "/dev/fb0" Option "SwapbuffersWait" "true" EndSection _EOF_ #Asus TB # elif (( $G_HW_MODEL == 52 )); then # cat << _EOF_ > /etc/X11/xorg.conf # Section "Device" # Identifier "Rockchip Graphics" # Driver "modesetting" # Option "AccelMethod" "glamor" # Option "DRI" "2" # EndSection # _EOF_ fi fi #Nvidia driver INSTALLING_INDEX=151 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Install G_AGI nvidia-driver nvidia-xconfig # + i386 OpenGL G_AGI libgl1-nvidia-glx:i386 fi #Avahi-Daemon INSTALLING_INDEX=152 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI avahi-daemon fi INSTALLING_INDEX=16 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI build-essential make autoconf automake --no-install-recommends fi INSTALLING_INDEX=170 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI ntp # Remove service, as DietPi ntpd-mode launches the binary with custom commands systemctl stop ntp rm /etc/init.d/ntp Reset_NTPD fi INSTALLING_INDEX=17 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI git --no-install-recommends fi INSTALLING_INDEX=4 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI vifm fi INSTALLING_INDEX=20 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI vim fi INSTALLING_INDEX=21 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI vim-tiny fi INSTALLING_INDEX=127 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI neovim fi INSTALLING_INDEX=18 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI emacs fi INSTALLING_INDEX=12 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI iperf fi INSTALLING_INDEX=3 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI mc fi INSTALLING_INDEX=19 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI jed fi INSTALLING_INDEX=10 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI iftop fi INSTALLING_INDEX=11 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI iptraf fi INSTALLING_INDEX=13 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI mtr-tiny fi INSTALLING_INDEX=14 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI nload fi INSTALLING_INDEX=15 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI tcpdump fi INSTALLING_INDEX=0 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI openssh-client fi INSTALLING_INDEX=1 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Remove Information file rm /mnt/samba/readme.txt &> /dev/null G_AGI smbclient cifs-utils --no-install-recommends fi INSTALLING_INDEX=2 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Remove information file rm /mnt/ftp_client/readme.txt &> /dev/null G_AGI curlftpfs fi INSTALLING_INDEX=110 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Remove information file rm /mnt/nfs_client/readme.txt &> /dev/null G_AGI nfs-common fi INSTALLING_INDEX=104 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI dropbear #set to start on next boot sed -i '/NO_START=1/c\NO_START=0' /etc/default/dropbear fi INSTALLING_INDEX=105 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI openssh-server --no-install-recommends # - Remove all references before adding the entry: https://github.com/Fourdee/DietPi/issues/604 sed -i '/PermitRootLogin[[:space:]]/d' /etc/ssh/sshd_config echo -e "\n\n#Allow root login over SSH\nPermitRootLogin yes" >> /etc/ssh/sshd_config #Generate host keys # - remove all previous rm /etc/ssh/ssh_host_key rm /etc/ssh/ssh_host_rsa_key rm /etc/ssh/ssh_host_dsa_key # - Generate ssh-keygen -f /etc/ssh/ssh_host_key -N '' -t rsa1 ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa # - Set permissions chmod -R 700 /etc/ssh/ #Restart ssh server now so root users can login during setup. systemctl restart ssh #SSH server package also installs client. aSOFTWARE_INSTALL_STATE[0]=2 fi INSTALLING_INDEX=103 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #Install (add tmpfs mount to fstab) sed -i '/\/var\/log/c\tmpfs \/var\/log tmpfs defaults,size=20m,noatime,nodev,nosuid,mode=1777 0 0' /etc/fstab fi INSTALLING_INDEX=101 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI logrotate --no-install-recommends fi INSTALLING_INDEX=102 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing G_AGI rsyslog --no-install-recommends fi INSTALLING_INDEX=7 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #RPi + OpenMAX HW Encoding: https://github.com/Fourdee/DietPi/issues/869 if (( $G_HW_MODEL < 10 )); then INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/rpi/ffmpeg_rpi.7z' G_CHECK_URL "$INSTALL_URL_ADDRESS" wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z -offmpeg_rpi dpkg -i ffmpeg_rpi/*.deb rm -R ffmpeg_rpi rm package.7z #Everything else else G_AGI ffmpeg fi fi INSTALLING_INDEX=8 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing # On Jessie use backports repo: if (( $G_DISTRO == 3 )); then cat << _EOF_ > /etc/apt/preferences.d/99-dietpi-openjdk-8-jdk Package: openjdk-8-jdk Pin: release a=jessie-backports Pin-Priority: 990 _EOF_ G_AGI openjdk-8-jdk -t jessie-backports else G_AGI openjdk-8-jdk fi fi INSTALLING_INDEX=9 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing #check, is online INSTALL_URL_ADDRESS='http://raw.githubusercontent.com/taaem/nodejs-linux-installer/master/node-install.sh' G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Preqs wget "$INSTALL_URL_ADDRESS" -O node_install.sh chmod +x node_install.sh ./node_install.sh rm node_install.sh fi INSTALLING_INDEX=130 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='https://bootstrap.pypa.io/get-pip.py' G_CHECK_URL "$INSTALL_URL_ADDRESS" # - Preqs G_AGI python python-dev wget "$INSTALL_URL_ADDRESS" -O install.py python ./install.py rm install.py G_AGI python-pip python3-pip fi #SDL2 INSTALLING_INDEX=140 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing INSTALL_URL_ADDRESS='http://dietpi.com/downloads/binaries/rpi/sdl2_rpi.7z' G_CHECK_URL "$INSTALL_URL_ADDRESS" #G_AGI libxss1 #if using SDL2+rpi5 wget "$INSTALL_URL_ADDRESS" -O package.7z 7z x -y package.7z -osdl2_rpi rm package.7z dpkg -i sdl2_rpi/no_opengl_x11/*.deb rm -R sdl2_rpi fi #Mono repo INSTALLING_INDEX=150 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF #ARMv6 only available in raspbian repo: https://github.com/Fourdee/DietPi/issues/1023 if (( $G_HW_ARCH == 1 )); then echo -e "deb http://download.mono-project.com/repo/debian raspbian$G_DISTRO_NAME main" > /etc/apt/sources.list.d/mono-xamarin.list else echo -e "deb http://download.mono-project.com/repo/debian $G_DISTRO_NAME main" > /etc/apt/sources.list.d/mono-xamarin.list fi G_AGUP G_AGI mono-runtime fi #------------------ Home Automation: Home Assistant ------------------ INSTALLING_INDEX=157 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Installing HA_USER="homeassistant" HA_USERROOT="/home/$HA_USER" HA_SRVROOT="/srv/homeassistant" HA_PYENV_ACTIVATION="export PATH=\"$HA_USERROOT/.pyenv/bin:\$PATH\"; eval \"\$(pyenv init -)\"; eval \"\$(pyenv virtualenv-init -)\"" HA_PYTHON_VERSION="3.6.3" G_DIETPI-NOTIFY 2 "HA_USER: $HA_USER" G_DIETPI-NOTIFY 2 "HA_USERROOT: $HA_USERROOT" G_DIETPI-NOTIFY 2 "HA_SRVROOT: $HA_SRVROOT" G_DIETPI-NOTIFY 2 "HA_PYENV_ACTIVATION: $HA_PYENV_ACTIVATION" G_DIETPI-NOTIFY 2 "HA_PYTHON_VERSION: $HA_PYTHON_VERSION" # Install needed libraries G_AGI libssl-dev git cmake libc-ares-dev uuid-dev daemon curl libgnutls28-dev libgnutlsxx28 nmap net-tools sudo libglib2.0-dev libudev-dev swig libssl-dev libusb-1.0-0 gcc libssl-dev libffi-dev libbz2-dev zlib1g-dev libreadline-dev libsqlite3-dev libncurses5-dev libncursesw5-dev if (( $G_DISTRO < 4 )); then G_AGI libmysqlclient-dev else G_AGI libmariadbclient-dev fi # Setup the user account information adduser --system $HA_USER addgroup $HA_USER usermod -G dialout -a $HA_USER # this allows the dietpi user to edit the files along with HA. usermod -G dietpi -a $HA_USER mkdir $HA_SRVROOT chown $HA_USER:$HA_USER $HA_SRVROOT # Install pyenv su --shell /bin/bash --command "cd $HA_USERROOT; curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash" $HA_USER # Install Python which is needed for HA. su --shell /bin/bash --command "cd $HA_USERROOT; $HA_PYENV_ACTIVATION; pyenv install $HA_PYTHON_VERSION" $HA_USER # Make the virtual environment. su --shell /bin/bash --command "cd $HA_SRVROOT; $HA_PYENV_ACTIVATION; pyenv virtualenv $HA_PYTHON_VERSION homeassistant-$HA_PYTHON_VERSION" $HA_USER su --shell /bin/bash --command "cd $HA_SRVROOT; $HA_PYENV_ACTIVATION; pyenv local homeassistant-$HA_PYTHON_VERSION" $HA_USER su --shell /bin/bash --command "cd $HA_SRVROOT; $HA_PYENV_ACTIVATION; pyenv local" $HA_USER # Install Home Assistant and extra modules. su --shell /bin/bash --command "cd $HA_SRVROOT; $HA_PYENV_ACTIVATION; pyenv activate homeassistant-$HA_PYTHON_VERSION; pip3 install colorlog PyMySQL mysqlclient" $HA_USER su --shell /bin/bash --command "cd $HA_SRVROOT; $HA_PYENV_ACTIVATION; pyenv activate homeassistant-$HA_PYTHON_VERSION; pip3 install --upgrade homeassistant" $HA_USER # Generate the scripts to launch HA using pyenv. echo '#!/bin/bash' > $HA_SRVROOT/homeassistant-start.sh echo "cd $HA_SRVROOT" >> $HA_SRVROOT/homeassistant-start.sh echo "$HA_PYENV_ACTIVATION" >> $HA_SRVROOT/homeassistant-start.sh echo "pyenv activate homeassistant-$HA_PYTHON_VERSION" >> $HA_SRVROOT/homeassistant-start.sh echo "hass -c \"$HA_USERROOT/.homeassistant\"" >> $HA_SRVROOT/homeassistant-start.sh #su --shell /bin/bash --command "/srv/homeassistant/homeassistant-start.sh" homeassistant chmod +x /srv/homeassistant/homeassistant-start.sh fi #------------------------------------------------------------------- #Reset error handler (eg: for usermsg clear set in Banner_Installing) G_ERROR_HANDLER_RESET #------------------------------------------------------------------- } Uninstall_NonSelected_Choices(){ #Uninstall software using our temp uninstall list if [ -f "$UNINSTALL_FILE" ]; then #Run the temp uninstall script while read -r line do Uninstall_Software "$line" done < $UNINSTALL_FILE rm $UNINSTALL_FILE fi } Apply_SSHServer_Choices(){ #Work out which SSH Server needs installing from Indexs (if any) #Work out which SSH server needs removing (if any), and, create a temp script file if (( $INDEX_SSHSERVER_TARGET != $INDEX_SSHSERVER_CURRENT )); then # - No SSH server if (( $INDEX_SSHSERVER_TARGET == 0 )); then echo -e "104" >> "$UNINSTALL_FILE" echo -e "105" >> "$UNINSTALL_FILE" # - Dropbear elif (( $INDEX_SSHSERVER_TARGET == -1 )); then aSOFTWARE_INSTALL_STATE[104]=1 echo -e "105" >> "$UNINSTALL_FILE" # - Openssh elif (( $INDEX_SSHSERVER_TARGET == -2 )); then aSOFTWARE_INSTALL_STATE[105]=1 echo -e "104" >> "$UNINSTALL_FILE" fi #Inform user (From testing, stopping SSH server services does not disconnect user, however, just incase it does in the future) G_DIETPI-NOTIFY 3 DietPi-Software "Stopping SSH servers" #stop all SSH server services service ssh stop &> /dev/null service dropbear stop &> /dev/null #Update Current SSHSERVER index INDEX_SSHSERVER_CURRENT=$INDEX_SSHSERVER_TARGET fi } Apply_FileServer_Choices(){ #Work out which File Server needs installing from Indexs (if any) #Work out which File server needs removing (if any), and, create a temp script file if (( $INDEX_FILESERVER_TARGET != $INDEX_FILESERVER_CURRENT )); then #No File server if (( $INDEX_FILESERVER_TARGET == 0 )); then echo -e "96" >> "$UNINSTALL_FILE" echo -e "94" >> "$UNINSTALL_FILE" #echo -e "95" >> "$UNINSTALL_FILE" #ProFTP elif (( $INDEX_FILESERVER_TARGET == -1 )); then aSOFTWARE_INSTALL_STATE[94]=1 echo -e "96" >> "$UNINSTALL_FILE" #Samba elif (( $INDEX_FILESERVER_TARGET == -2 )); then aSOFTWARE_INSTALL_STATE[96]=1 echo -e "94" >> "$UNINSTALL_FILE" fi #Update Current SSHSERVER index INDEX_FILESERVER_CURRENT=$INDEX_FILESERVER_TARGET fi } Apply_Logging_Choices(){ #Work out which Logging system needs installing from Indexs (if any) #Work out which Logging system needs removing (if any), and, create a temp script file if (( $INDEX_LOGGING_TARGET != $INDEX_LOGGING_CURRENT )); then #None if (( $INDEX_LOGGING_TARGET == 0 )); then echo -e "101" >> "$UNINSTALL_FILE" echo -e "103" >> "$UNINSTALL_FILE" echo -e "102" >> "$UNINSTALL_FILE" #Ramlog - clear every 24H elif (( $INDEX_LOGGING_TARGET == -1 )); then aSOFTWARE_INSTALL_STATE[103]=1 echo -e "101" >> "$UNINSTALL_FILE" echo -e "102" >> "$UNINSTALL_FILE" #Ramlog - backup every 1H to $HOME/logfile_storage, then clear. elif (( $INDEX_LOGGING_TARGET == -2 )); then aSOFTWARE_INSTALL_STATE[103]=1 echo -e "101" >> "$UNINSTALL_FILE" echo -e "102" >> "$UNINSTALL_FILE" #Logrotate + rsyslog - logs to disk elif (( $INDEX_LOGGING_TARGET == -3 )); then aSOFTWARE_INSTALL_STATE[101]=1 aSOFTWARE_INSTALL_STATE[102]=1 echo -e "103" >> "$UNINSTALL_FILE" fi #Update Current Logging index INDEX_LOGGING_CURRENT=$INDEX_LOGGING_TARGET fi } Apply_Webserver_Preference(){ if (( $INDEX_WEBSERVER_TARGET != $INDEX_WEBSERVER_CURRENT )); then #Update Current to Target INDEX_WEBSERVER_CURRENT=$INDEX_WEBSERVER_TARGET fi } Install_Apply_Permissions(){ #Not all permissions are listed here. # - Only ones which are shared across programs, and/or located inside G_FP_DIETPI_USERDATA that require non-root permissions. #- /var/www / www-data chown -R www-data:www-data /var/www chmod -R 775 /var/www # - O!MPD, requires write permissions chmod -R 777 /var/www/ompd/tmp #(required for database update) chmod -R 777 /var/www/ompd/stream #(required for streaming files) chmod -R 777 /var/www/ompd/cache #(required for downloading files) #Apply non-root permissions for files and folders in G_FP_DIETPI_USERDATA # - dietpi user chown -R dietpi:dietpi /home/dietpi chown -R dietpi:dietpi "$G_FP_DIETPI_USERDATA" chmod -R 775 "$G_FP_DIETPI_USERDATA" # + for symlinked locations chown -R dietpi:dietpi "$G_FP_DIETPI_USERDATA"/* chmod -R 775 "$G_FP_DIETPI_USERDATA"/* # - MPD chown -R mpd:audio "$G_FP_DIETPI_USERDATA"/.mpd_cache # - MySQL data store chown -R mysql:mysql "$G_FP_DIETPI_USERDATA"/mysql chmod -R 770 "$G_FP_DIETPI_USERDATA"/mysql chown -R mineos:mineos "$G_FP_DIETPI_USERDATA"/mineos/serverdata chown -R urbackup:urbackup "$G_FP_DIETPI_USERDATA"/urbackup #chown -R couchpotato:couchpotato "$G_FP_DIETPI_USERDATA"/couchpotato # - www-data chown -R www-data:www-data "$G_FP_DIETPI_USERDATA"/dietpicam chown -R www-data:www-data "$G_FP_DIETPI_USERDATA"/pydio_data local datadir=$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_OWNCLOUD_DATADIR=' | sed 's/.*=//') [ ! -n "$datadir" ] && datadir="$G_FP_DIETPI_USERDATA/owncloud_data" chown -R www-data:www-data "$datadir" datadir=$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_NEXTCLOUD_DATADIR=' | sed 's/.*=//') [ ! -n "$datadir" ] && datadir="$G_FP_DIETPI_USERDATA/nextcloud_data" chown -R www-data:www-data "$datadir" # - Home Assistant Permissions #chown -R homeassistant:dietpi /home/homeassistant/.homeassistant #chown -R dietpi:dietpi "$G_FP_DIETPI_USERDATA"/homeassistant # - Minio chown -R minio-user:minio-user "$G_FP_DIETPI_USERDATA"/minio-data # - FuguHub chown -R bd:bd "$G_FP_DIETPI_USERDATA"/fuguhub-data/ # - Nodered chown -R nodered:nodered "$G_FP_DIETPI_USERDATA"/node-red } #///////////////////////////////////////////////////////////////////////////////////// # Configuration post installation goes here. # # Reference: # - Adding new software to DietPi-Software # https://github.com/Fourdee/DietPi/issues/490#issuecomment-244416570 # # Adding post installation steps. # ------------------------------------ # - INSTALLING_INDEX: # This has to be the same number as index_current for the software list above. # # Here you can add any configuration changes or addtions to systemd. After this # has run it will reload the systemd environment and start any services installed # and referenced in 'dietpi-services' # # Example: # #------------------ Desktop: MATE ------------------ # INSTALLING_INDEX=24 # if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then # # # - file manager desktop icon # ln -sf /usr/share/applications/caja.desktop "$HOME"/Desktop/caja.desktop # # Create_Desktop_Shared_Items # # #Odroid C2, define default pulseaudio sink: https://github.com/Fourdee/DietPi/issues/415 # if (( $G_HW_MODEL == 12 && # ! $(cat /etc/pulse/default.pa | grep -ci -m1 '^set-default-sink alsa_output.platform-odroid_hdmi.37.analog-stereo') )); then # # echo -e "set-default-sink alsa_output.platform-odroid_hdmi.37.analog-stereo" >> /etc/pulse/default.pa # # fi # # fi # #///////////////////////////////////////////////////////////////////////////////////// Install_Apply_Configs(){ # Copy/Set optimised Software settings. # Set install states to 2 (installed). #DESKTOP_LXDE INSTALLING_INDEX=23 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Remove Lxrandr Menu item (monitor configuration tool as we set res in dietpi-config) rm /usr/share/applications/lxrandr.desktop &> /dev/null #Copy PCmanFM configs mkdir -p "$HOME"/.config/pcmanfm/LXDE wget http://dietpi.com/downloads/conf/desktop/pcmanfm.conf -O "$HOME"/.config/pcmanfm/LXDE/pcmanfm.conf wget http://dietpi.com/downloads/conf/desktop/pcmanfm-desktopitems.conf -O "$HOME"/.config/pcmanfm/LXDE/desktop-items-0.conf #Disable Trash sed -i '/use_trash=/c\use_trash=0' /etc/xdg/libfm/libfm.conf #Copy DietPi Panel config mkdir -p "$HOME"/.config/lxpanel/LXDE/panels wget http://dietpi.com/downloads/conf/desktop/panel -O "$HOME"/.config/lxpanel/LXDE/panels/panel #Openbox config mkdir -p "$HOME"/.config/openbox wget http://dietpi.com/downloads/conf/desktop/lxde-rc.xml -O "$HOME"/.config/openbox/lxde-rc.xml # - file manager desktop icon ln -sf /usr/share/applications/pcmanfm.desktop "$HOME"/Desktop/pcmanfm.desktop Create_Desktop_Shared_Items fi #Desktop MATE INSTALLING_INDEX=24 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - file manager desktop icon ln -sf /usr/share/applications/caja.desktop "$HOME"/Desktop/caja.desktop Create_Desktop_Shared_Items #Odroid C2, define default pulseaudio sink: https://github.com/Fourdee/DietPi/issues/415 if (( $G_HW_MODEL == 12 && ! $(cat /etc/pulse/default.pa | grep -ci -m1 '^set-default-sink alsa_output.platform-odroid_hdmi.37.analog-stereo') )); then echo -e "set-default-sink alsa_output.platform-odroid_hdmi.37.analog-stereo" >> /etc/pulse/default.pa fi fi #Desktop GNUStep INSTALLING_INDEX=26 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration Create_Desktop_Shared_Items fi #DESKTOP_XFCE INSTALLING_INDEX=25 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration Create_Desktop_Shared_Items fi #WEBSERVER_APACHE INSTALLING_INDEX=83 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #create www directory mkdir -p /var/www #Apache2 confs cp /DietPi/dietpi/conf/apache2_jessie.conf /etc/apache2/apache2.conf cat << _EOF_ > /etc/apache2/sites-available/000-default.conf ServerAdmin webmaster@localhost DocumentRoot /var/www ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined _EOF_ cat << _EOF_ > /etc/apache2/mods-available/mpm_event.conf StartServers $G_HW_CPU_CORES MinSpareThreads 1 MaxSpareThreads 8 ThreadLimit 16 ThreadsPerChild 4 MaxRequestWorkers 50 MaxConnectionsPerChild 0 _EOF_ cat << _EOF_ > /etc/apache2/mods-available/mpm_prefork.conf StartServers $G_HW_CPU_CORES MinSpareServers 1 MaxSpareServers $G_HW_CPU_CORES MaxRequestWorkers 50 MaxConnectionsPerChild 0 _EOF_ cat << _EOF_ > /etc/apache2/mods-available/mpm_worker.conf StartServers $G_HW_CPU_CORES MinSpareThreads 1 MaxSpareThreads 8 ThreadLimit 16 ThreadsPerChild 4 MaxRequestWorkers 50 MaxConnectionsPerChild 0 _EOF_ #Use /var/www as default webfolder mv /var/www/html/index.html /var/www/index.html &> /dev/null rm -R /var/www/html &> /dev/null #Sites-Available settings. Disable access log, set error log level sed -i "/CustomLog /c\ #CustomLog "'${APACHE_LOG_DIR}'"/access.log combined" /etc/apache2/sites-available/* sed -i "/LogLevel /c\ LogLevel error" /etc/apache2/sites-available/* fi #WEBSERVER_NGINX INSTALLING_INDEX=85 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #create www directory mkdir -p /var/www #Nginx confs mkdir /etc/nginx/sites-dietpi cp /DietPi/dietpi/conf/nginx.conf /etc/nginx/nginx.conf # - Stretch , set php7.0 if (( $G_DISTRO >= 4 )); then sed -i "s#/run/php5-fpm.sock#/run/php/php7.0-fpm.sock#g" /etc/nginx/nginx.conf fi # - CPU core count sed -i "/worker_processes/c\worker_processes $G_HW_CPU_CORES;" /etc/nginx/nginx.conf #Default site cp /DietPi/dietpi/conf/nginx.site-available-default /etc/nginx/sites-available/default # - Stretch , set php7.0 if (( $G_DISTRO >= 4 )); then sed -i "s#/run/php5-fpm.sock#/run/php/php7.0-fpm.sock#g" /etc/nginx/sites-available/default fi # - Nginx index page cp /usr/share/nginx/html/index.html /var/www/index.html fi #WEBSERVER_LIGHTTPD INSTALLING_INDEX=84 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #create www directory mkdir -p /var/www #www path 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/php7.0-fpm.sock' if (( $G_DISTRO == 3 )); then fp_php_fpm_sock='/var/run/php5-fpm.sock' fi 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 ## Start an FastCGI server using php-fpm fastcgi.server += ( ".php" => (( "socket" => "$fp_php_fpm_sock", "broken-scriptfilename" => "enable" )) ) _EOF_ #enable cgi/php lighttpd-enable-mod fastcgi lighttpd-enable-mod fastcgi-php #Move default page mv /var/www/html/index.lighttpd.html /var/www/ service lighttpd force-reload fi #WEBSERVER_PHP INSTALLING_INDEX=89 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Apache2 has its own PHP module if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then # https://github.com/Fourdee/DietPi/issues/1144 local php_service='/lib/systemd/system/apache2.service' # - All other webservers (eg: Nginx/Lighttpd) use PHP-FPM else local php_service='/lib/systemd/system/php*-fpm.service' # - PHP-FPM confs sed -i '/cgi.fix_pathinfo=/c\cgi.fix_pathinfo=1' "$FP_PHP_BASE_DIR"/fpm/php.ini # - PHP-FPM optimizations based on total cores sed -i "/pm.max_children = /c\pm.max_children = $(( $G_HW_CPU_CORES * 3 ))" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf sed -i "/pm.start_servers = /c\pm.start_servers = $G_HW_CPU_CORES" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf sed -i "/pm.min_spare_servers = /c\pm.min_spare_servers = $G_HW_CPU_CORES" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf sed -i "/pm.max_spare_servers = /c\pm.max_spare_servers = $G_HW_CPU_CORES" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf # - Enviroment PHP settings: sed -i "/env\[HOSTNAME\]/c\env\[HOSTNAME\] = \$HOSTNAME" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf sed -i "/env\[PATH\]/c\env\[PATH\] = /usr/local/bin:/usr/bin:/bin" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf # /tmp is mounted to RAM, so use DISK (/var/tmp) instead sed -i "/env\[TMP\]/c\env\[TMP\] = /var/tmp" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf sed -i "/env\[TMPDIR\]/c\env\[TMPDIR\] = /var/tmp" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf sed -i "/env\[TEMP\]/c\env\[TEMP\] = /var/tmp" "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf fi # PHP cache settings local target_php_ini=0 local target_php_cachesize=$(( $RAM_TOTAL / 30 )) if (( $target_php_cachesize < 10 )); then target_php_cachesize=10 fi # - OPcache if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then target_php_ini="$FP_PHP_BASE_DIR/apache2/php.ini" else target_php_ini="$FP_PHP_BASE_DIR/fpm/php.ini" fi sed -i "/opcache.enable=/c\opcache.enable=1" $target_php_ini sed -i "/opcache.memory_consumption=/c\opcache.memory_consumption=$target_php_cachesize" $target_php_ini sed -i "/opcache.revalidate_freq=/c\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/Fourdee/DietPi/issues/218 target_php_cachesize+="M" # - - 3days TTL local target_apc_ttl='259200' cat << _EOF_ > "$target_php_ini" extension=apcu.so apc.shm_size=$target_php_cachesize apc.ttl=$target_apc_ttl _EOF_ # We create our own PHP mod to add DietPi specific configs. local dietpi_php_ini="$FP_PHP_BASE_DIR/mods-available/dietpi.ini" touch $dietpi_php_ini # - Set tmp_upload_dir to sd. 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/Fourdee/DietPi/issues/1144 if grep -q '^\s*PrivateTmp=true' $php_service &> /dev/null; then local tmp_upload_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" fi grep -q 'upload_tmp_dir' $dietpi_php_ini && sed -i "/upload_tmp_dir/c\upload_tmp_dir = $tmp_upload_dir" $dietpi_php_ini || echo "upload_tmp_dir = $tmp_upload_dir" >> $dietpi_php_ini # - max upload size local php_max_upload_size="$(( $(php -r 'print(PHP_INT_MAX);') / 1024 / 1024))M" # - - upload_max_filesize grep -q 'upload_max_filesize' $dietpi_php_ini && sed -i "/upload_max_filesize/c\upload_max_filesize = $php_max_upload_size" $dietpi_php_ini || echo "upload_max_filesize = $php_max_upload_size" >> $dietpi_php_ini # - - post_max_size grep -q 'post_max_size' $dietpi_php_ini && sed -i "/post_max_size/c\post_max_size = $php_max_upload_size" $dietpi_php_ini || echo "post_max_size = $php_max_upload_size" >> $dietpi_php_ini # - - Nginx - Set client_max_body_size to avoid 2MB upload error: https://github.com/Fourdee/DietPi/issues/546 if (( ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then sed -i "/client_max_body_size/c\ client_max_body_size $php_max_upload_size;" /etc/nginx/nginx.conf fi # - Set UTF-8 grep -q 'default_charset' $dietpi_php_ini && sed -i '/default_charset/c\default_charset = "UTF-8"' $dietpi_php_ini || echo 'default_charset = "UTF-8"' >> $dietpi_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_APT_PACKAGE_NAME}enmod "$modules_to_enable" # PHP info page echo "" > /var/www/phpinfo.php # OPcache info page wget https://raw.githubusercontent.com/rlerdorf/opcache-status/master/opcache.php -O /var/www/opcache.php # APC info page wget https://github.com/krakjoe/apcu/raw/master/apc.php -O /var/www/apc.php fi #WEBSERVER_MARIADB INSTALLING_INDEX=88 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # Move SQL store to userdata location: https://github.com/Fourdee/DietPi/issues/672 if [ "$(readlink /var/lib/mysql)" != "$G_FP_DIETPI_USERDATA/mysql/" ]; then G_RUN_CMD systemctl stop mysql # - Create target dir mkdir -p "$G_FP_DIETPI_USERDATA"/mysql # - copy cp -a /var/lib/mysql/* "$G_FP_DIETPI_USERDATA"/mysql/ if (( $? != 0 )); then G_DIETPI-NOTIFY 1 "Moving of MySQL data store failed to $G_FP_DIETPI_USERDATA/mysql. DietPi-Software will now exit" Exit_Destroy fi rm -R /var/lib/mysql &> /dev/null || rm /var/lib/mysql &> /dev/null # - Symlink ln -sf "$G_FP_DIETPI_USERDATA"/mysql /var/lib/mysql chown mysql:mysql /var/lib/mysql # - Set permissions on data store directory NOW. Install_Apply_Permissions &> /dev/null fi # On Jessie assure unix_socket authentication: if (( $G_DISTRO < 4 )); then G_RUN_CMD systemctl start mysql mysql -e "install plugin unix_socket soname 'auth_socket';" &> /dev/null mysql -e "grant all privileges on *.* to 'root'@'localhost' identified via unix_socket with grant option;flush privileges" # Drop unnecessary root user children. mysql -e "drop user 'root'@'dietpi';drop user 'root'@'127.0.0.1';drop user 'root'@'::1'" &> /dev/null fi ### Also for MariaDB? # Optimize for reduced memory use: https://github.com/Fourdee/DietPi/issues/605#issue-188930987 #cat << _EOF_ > /etc/mysql/conf.d/reduce_resources.cnf #[mysqld] #key_buffer_size=8M #max_connections=30 #query_cache_size=8M #query_cache_limit=512K #thread_stack=128K #_EOF_ fi #WEBSERVER_MYADMINPHP INSTALLING_INDEX=90 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #NGINX LIGHTTPD symlink to var www if (( ${aSOFTWARE_INSTALL_STATE[84]} >= 1 || ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then ln -sf /usr/share/phpmyadmin /var/www fi # Due to MariaDB unix_socket authentication, "root" cannot be used to login the web ui. # Thus default "phpmyadmin" user need to be used, who on Jessie does not have all privileges: # http://dietpi.com/phpbb/viewtopic.php?f=8&t=5&p=54#p54 mysql -e "grant all privileges on *.* to phpmyadmin@localhost with grant option" fi #WEBSERVER_REDIS INSTALLING_INDEX=91 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # Enable redis php module, if installed: "$PHP_APT_PACKAGE_NAME"enmod redis 2> /dev/null fi #OPENBAZAAR INSTALLING_INDEX=58 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - service cat << _EOF_ > /etc/systemd/system/openbazaar.service [Unit] Description=openbazaar [Service] Type=simple WorkingDirectory=/etc/openbazaar-server ExecStart=$(which python) openbazaard.py start -a 0.0.0.0 [Install] WantedBy=multi-user.target _EOF_ fi #YaCy INSTALLING_INDEX=133 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration chmod +x -R /etc/yacy cat << _EOF_ > /etc/systemd/system/yacy.service [Unit] Description=DietPi YaCy Service [Service] Type=simple RemainAfterExit=yes ExecStart=/bin/bash -c '/etc/yacy/startYACY.sh' ExecStop=/bin/bash -c '/etc/yacy/stopYACY.sh' [Install] WantedBy=multi-user.target _EOF_ systemctl daemon-reload # Create admin login account: /etc/yacy/bin/passwd.sh "$GLOBAL_PW" fi #ownCloud INSTALLING_INDEX=47 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration G_DIETPI-NOTIFY 2 'Enabling needed PHP modules: https://doc.owncloud.org/server/latest/admin_manual/installation/source_installation.html#php-extensions' "$PHP_APT_PACKAGE_NAME"enmod curl gd intl json pdo_mysql opcache apcu redis # Following modules are switchable since Stretch: if (( $G_DISTRO > 3 )); then phpenmod ctype dom fileinfo iconv mbstring posix simplexml xmlwriter xmlreader zip exif fi # APCu configuration: To prevent cli (cron.php) producing ownCloud log entries. grep -q 'apc.enable_cli=' $FP_PHP_BASE_DIR/mods-available/apcu.ini && sed -i '/apc.enable_cli=/c\apc.enable_cli=1' $FP_PHP_BASE_DIR/mods-available/apcu.ini || echo 'apc.enable_cli=1' >> $FP_PHP_BASE_DIR/mods-available/apcu.ini if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then G_DIETPI-NOTIFY 2 'Apache webserver found, enable ownCloud specific configuration: "https://doc.owncloud.org/server/latest/admin_manual/installation/source_installation.html#configure-apache-web-server"' a2enmod rewrite headers env dir mime 1> /dev/null local owncloud_conf='/etc/apache2/sites-available/owncloud.conf' if [ -f $owncloud_conf ]; then G_DIETPI-NOTIFY 2 'Existing ownCloud configuration found, will save the new one for review and comparison to: /etc/apache2/sites-available/owncloud.conf.dietpi-new' owncloud_conf='/etc/apache2/sites-available/owncloud.conf.dietpi-new' fi cp /DietPi/dietpi/conf/apache.ownnextcloud.conf $owncloud_conf sed -i 's/nextcloud/owncloud/g' $owncloud_conf # OPcache adjustment is just needed by Nextcloud sed -i 's/php_admin_value/#php_admin_value/' $owncloud_conf a2ensite owncloud 1> /dev/null fi if (( ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then G_DIETPI-NOTIFY 2 'Nginx webserver found, enable ownCloud specific configuration: "https://doc.owncloud.org/server/latest/admin_manual/installation/nginx_configuration.html#owncloud-in-a-subdir-of-nginx"' local owncloud_config='/etc/nginx/sites-dietpi/owncloud.config' if [ -f $owncloud_config ]; then G_DIETPI-NOTIFY 2 'Existing ownCloud configuration found, will save the new one for review and comparison to: /etc/nginx/sites-dietpi/owncloud.config.dietpi-new' owncloud_config='/etc/nginx/sites-dietpi/owncloud.config.dietpi-new' fi cp /DietPi/dietpi/conf/nginx.sites-dietpi.owncloud.config $owncloud_config # Stretch: Use PHP7.0 socket and set 'fastcgi_request_buffering off'; if (( $G_DISTRO > 3 )); then sed -i 's|/run/php5-fpm.sock|/run/php/php7.0-fpm.sock|g' $owncloud_config sed -i 's/#fastcgi_request_buffering off;/fastcgi_request_buffering off;/g' $owncloud_config fi # Set HTTPS on, if SSL connection is available, even with self-signed/untrusted certificate. wget -q --spider --timeout=10 --tries=2 https://localhost &> /dev/null if (( $? == 0 || $? == 5)); then sed -i 's/#fastcgi_param HTTPS on;/fastcgi_param HTTPS on;/g' $owncloud_config fi fi # Enable 4-byte support for MariaDB: https://doc.owncloud.org/server/latest/admin_manual/configuration/database/linux_database_configuration.html#configure-mysql-for-4-byte-unicode-support cat << _EOF_ > /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf [mysqld] innodb_large_prefix=1 innodb_file_format=barracuda innodb_file_per_table=1 _EOF_ G_RUN_CMD systemctl restart mysql # Reload dietpi-globals to enable occ command shortcut: . /DietPi/dietpi/func/dietpi-globals # Adjusting config file: local config_php='/var/www/owncloud/config/config.php' local datadir="$(grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//')" [ -n "$datadir" ] || datadir="$G_FP_DIETPI_USERDATA/owncloud_data" mkdir -p "$datadir" Install_Apply_Permissions &> /dev/null if [ -d "$G_FP_DIETPI_USERDATA"/mysql/owncloud ]; then G_DIETPI-NOTIFY 2 'ownCloud database found, will NOT overwrite.' else if [ -f "$datadir"/dietpi-owncloud-database-backup.sql ]; then G_DIETPI-NOTIFY 2 'ownCloud database backup found, starting recovery...' local dbuser=$(grep -m1 "^[[:blank:]]*'dbuser'" $config_php | awk '{print $3}' | sed "s/[',]//g") local dbpass=$(grep -m1 "^[[:blank:]]*'dbpassword'" $config_php | awk '{print $3}' | sed "s/[',]//g") /DietPi/dietpi/func/create_mysql_db owncloud "$dbuser" "$dbpass" mysql -uroot owncloud < "$datadir"/dietpi-owncloud-database-backup.sql else local username="$(cat /DietPi/dietpi.txt | grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_NEXTCLOUD_USERNAME=' | sed 's/^.*=//')" [ -n "$username" ] || username='admin' # For MariaDB, temporary database admin user needs to be created, as 'root' uses unix_socket login, which cannot be accessed by sudo -u www-data. mysql -e "grant all privileges on *.* to 'tmp_root'@'localhost' identified by '$GLOBAL_PW' with grant option" grep -q "'installed' => true," $config_php 2>/dev/null || occ maintenance:install --no-interaction --database "mysql" --database-name "owncloud" --database-user "tmp_root" --database-pass "$GLOBAL_PW" --admin-user "$username" --admin-pass "$GLOBAL_PW" --data-dir "$datadir" mysql -e "drop user 'tmp_root'@'localhost'" fi fi # Enable ownCloud to use 4-byte database grep -q "^[[:blank:]]*'mysql.utf8mb4'" $config_php || sed -i "/^[[:blank:]]*'dbpassword'/a \ \ 'mysql.utf8mb4' => true," $config_php # Add local IP and hostname to trusted domains. # If "1 => '" does not exist, the config.php is not copied e.g. from older instance, so we add entries. if (( ! $(cat $config_php | grep -ci -m1 "1 => '") )); then sed -i "/0 => 'localhost'/a 1 => '$(sed -n 4p /DietPi/dietpi/.network)'," $config_php sed -i "/1 => '/a 2 => '$(cat /etc/hostname)'," $config_php fi # Set CLI URL to ownCloud sub directory: 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 grep -q "^[[:blank:]]*'htaccess.RewriteBase'" $config_php || sed -i "/^[[:blank:]]*'overwrite.cli.url'/a \ \ 'htaccess.RewriteBase' => '/owncloud'," $config_php occ maintenance:update:htaccess fi # APCu Memcache grep -q "^[[:blank:]]*'memcache.local'" $config_php || sed -i "/^[[:blank:]]*'version'/a \ \ 'memcache.local' => '\\\OC\\\Memcache\\\APCu'," $config_php # Redis for transactional file locking: # https://doc.owncloud.org/server/latest/admin_manual/configuration/server/caching_configura$ # - Enable Redis socket and grant www-data access to it: local redis_conf="/etc/redis/redis*.conf" grep -q "^[[:blank:]]*unixsocket /" $redis_conf || grep -q '^[[:blank:]]*#unixsocket /' $redis_conf && sed -i 's|^[[:blank:]]*#unixsocket /|unixsocket /|' $redis_conf || echo 'unixsocket /var/run/redis/redis.sock' >> $redis_conf grep -q "^[[:blank:]]*#?unixsocketperm " $redis_conf && sed -i "/^[[:blank:]]*#?unixsocketperm /c\unixsocketperm 770" $redis_conf || echo 'unixsocketperm 770' >> $redis_conf local redis_sock=$(grep "^[[:blank:]]*unixsocket /" $redis_conf | sed "s/^[[:blank:]]*unixsocket //") usermod -a -G redis www-data # - Enable ownCloud to use Redis socket: if (( ! $(cat $config_php | grep -ci -m1 "'memcache.locking'") )); then sed -i "\#'memcache.local'#a \ \ 'filelocking.enabled' => true,\n\ 'memcache.locking' => '\\\OC\\\Memcache\\\Redis',\n\ 'redis' => [\n\ 'host' => '$redis_sock',\n\ 'port' => 0,\n\ ]," $config_php fi # Enable ownCloud background cron job: crontab -u www-data -l 2>/dev/null | grep -q '/var/www/owncloud/cron.php' || ( crontab -u www-data -l 2>/dev/null ; echo "*/15 * * * * php /var/www/owncloud/cron.php" ) | crontab -u www-data - occ background:cron # Enable maintenance mode to allow handling by dietpi-services: grep -q "^[[:blank:]]*'maintenance' => true," $config_php || occ maintenance:mode --on fi #Nextcloud INSTALLING_INDEX=114 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration G_DIETPI-NOTIFY 2 'Enabling needed PHP modules: https://docs.nextcloud.com/server/12/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation' "$PHP_APT_PACKAGE_NAME"enmod curl gd intl json pdo_mysql opcache apcu redis # Following modules are switchable since Stretch: if (( $G_DISTRO > 3 )); then phpenmod ctype dom fileinfo iconv mbstring posix simplexml xmlwriter xmlreader zip exif fi # APCu configuration: To prevent cli (cron.php) producing Nextcloud log [info] entries. grep -q 'apc.enable_cli=' $FP_PHP_BASE_DIR/mods-available/apcu.ini && sed -i '/apc.enable_cli=/c\apc.enable_cli=1' $FP_PHP_BASE_DIR/mods-available/apcu.ini || echo 'apc.enable_cli=1' >> $FP_PHP_BASE_DIR/mods-available/apcu.ini # OPCache configuration: https://docs.nextcloud.com/server/12/admin_manual/configuration_server/server_tuning.html?highlight=opcache#enable-php-opcache grep -q 'opcache.enable=' $FP_PHP_BASE_DIR/mods-available/opcache.ini && sed -i '/opcache.enable=/c\opcache.enable=1' $FP_PHP_BASE_DIR/mods-available/opcache.ini || echo 'opcache.enable=1' >> $FP_PHP_BASE_DIR/mods-available/opcache.ini grep -q 'opcache.enable_cli=' $FP_PHP_BASE_DIR/mods-available/opcache.ini && sed -i '/opcache.enable_cli=/c\opcache.enable_cli=1' $FP_PHP_BASE_DIR/mods-available/opcache.ini || echo 'opcache.enable_cli=1' >> $FP_PHP_BASE_DIR/mods-available/opcache.ini grep -q 'opcache.interned_strings_buffer=' $FP_PHP_BASE_DIR/mods-available/opcache.ini && sed -i '/opcache.interned_strings_buffer=/c\opcache.interned_strings_buffer=8' $FP_PHP_BASE_DIR/mods-available/opcache.ini || echo 'opcache.interned_strings_buffer=8' >> $FP_PHP_BASE_DIR/mods-available/opcache.ini grep -q 'opcache.max_accelerated_files=' $FP_PHP_BASE_DIR/mods-available/opcache.ini && sed -i '/opcache.max_accelerated_files=/c\opcache.max_accelerated_files=10000' $FP_PHP_BASE_DIR/mods-available/opcache.ini || echo 'opcache.max_accelerated_files=10000' >> $FP_PHP_BASE_DIR/mods-available/opcache.ini grep -q 'opcache.save_comments=' $FP_PHP_BASE_DIR/mods-available/opcache.ini && sed -i '/opcache.save_comments=/c\opcache.save_comments=1' $FP_PHP_BASE_DIR/mods-available/opcache.ini || echo 'opcache.save_comments=1' >> $FP_PHP_BASE_DIR/mods-available/opcache.ini grep -q 'opcache.revalidate_freq=' $FP_PHP_BASE_DIR/mods-available/opcache.ini && sed -i '/opcache.revalidate_freq=/c\opcache.revalidate_freq=1' $FP_PHP_BASE_DIR/mods-available/opcache.ini || echo 'opcache.revalidate_freq=1' >> $FP_PHP_BASE_DIR/mods-available/opcache.ini if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then G_DIETPI-NOTIFY 2 'Apache webserver found, enable Nextcloud specific configuration: "https://docs.nextcloud.com/server/12/admin_manual/installation/source_installation.html#apache-web-server-configuration"' a2enmod rewrite headers env dir mime 1> /dev/null local nextcloud_conf='/etc/apache2/sites-available/nextcloud.conf' if [ -f $nextcloud_conf ]; then G_DIETPI-NOTIFY 2 'Existing Nextcloud configuration found, will save the new one for review and comparison to: /etc/apache2/sites-available/nextcloud.conf.dietpi-new' nextcloud_conf='/etc/apache2/sites-available/nextcloud.conf.dietpi-new' fi cp /DietPi/dietpi/conf/apache.ownnextcloud.conf $nextcloud_conf a2ensite nextcloud 1> /dev/null fi if (( ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then G_DIETPI-NOTIFY 2 'Nginx webserver found, enable Nextcloud specific configuration: "https://docs.nextcloud.com/server/12/admin_manual/installation/nginx.html#nextcloud-in-a-subdir-of-nginx"' local nextcloud_config='/etc/nginx/sites-dietpi/nextcloud.config' if [ -f $nextcloud_config ]; then G_DIETPI-NOTIFY 2 'Existing Nextcloud configuration found, will save the new one for review and comparison to: /etc/nginx/sites-dietpi/nextcloud.config.dietpi-new' nextcloud_config='/etc/nginx/sites-dietpi/nextcloud.config.dietpi-new' fi cp /DietPi/dietpi/conf/nginx.sites-dietpi.nextcloud.config $nextcloud_config # Stretch: Use PHP7.0 socket and set 'fastcgi_request_buffering off'; if (( $G_DISTRO > 3 )); then sed -i 's|/run/php5-fpm.sock|/run/php/php7.0-fpm.sock|g' $nextcloud_config sed -i 's/#fastcgi_request_buffering off;/fastcgi_request_buffering off;/g' $nextcloud_config fi # Set HTTPS on, if SSL connection is available, even with self-signed/untrusted certificate. wget -q --spider --timeout=10 --tries=2 https://localhost &> /dev/null if (( $? == 0 || $? == 5)); then sed -i 's/#fastcgi_param HTTPS on;/fastcgi_param HTTPS on;/g' $nextcloud_config fi fi if (( ${aSOFTWARE_INSTALL_STATE[84]} >= 1 )); then G_DIETPI-NOTIFY 2 'Lighttpd webserver found, enable Nextcloud specific configuration.' local lighttpd_conf='/etc/lighttpd/lighttpd.conf' # Enable mod_setenv grep -q '^[[:blank:]]*"mod_setenv",' $lighttpd_conf || grep -q '^[[:blank:]#;]*"mod_setenv",' $lighttpd_conf && sed -i '/^[[:blank:]#;]*"mod_setenv",/c\ "mod_setenv",' $lighttpd_conf || sed -i '/^[[:blank:]]*server.modules = (/a\ "mod_setenv",' $lighttpd_conf # Move Nextcloud configuration file in place and activate it [ ! -f /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf ] && cp /DietPi/dietpi/conf/lighttpd.nextcloud.conf /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf lighttpd-enable-mod dietpi-nextcloud service lighttpd force-reload fi # Enable 4-byte support for MariaDB: https://docs.nextcloud.com/server/12/admin_manual/configuration_database/mysql_4byte_support.html cat << _EOF_ > /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf [mysqld] innodb_large_prefix=1 innodb_file_format=barracuda innodb_file_per_table=1 _EOF_ G_RUN_CMD systemctl restart mysql # Reload dietpi-globals to enable ncc command shortcut: . /DietPi/dietpi/func/dietpi-globals # Adjusting config file: local config_php='/var/www/nextcloud/config/config.php' local datadir="$(grep -m1 '^[[:blank:]]*SOFTWARE_NEXTCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//')" [ -n "$datadir" ] || datadir="$G_FP_DIETPI_USERDATA/nextcloud_data" mkdir -p "$datadir" Install_Apply_Permissions &> /dev/null if [ -d "$G_FP_DIETPI_USERDATA"/mysql/nextcloud ]; then G_DIETPI-NOTIFY 2 'Nextcloud database found, will NOT overwrite.' else if [ -f "$datadir"/dietpi-nextcloud-database-backup.sql ]; then G_DIETPI-NOTIFY 2 'Nextcloud database backup found, starting recovery...' local dbuser=$(grep -m1 "^[[:blank:]]*'dbuser'" $config_php | awk '{print $3}' | sed "s/[',]//g") local dbpass=$(grep -m1 "^[[:blank:]]*'dbpassword'" $config_php | awk '{print $3}' | sed "s/[',]//g") /DietPi/dietpi/func/create_mysql_db nextcloud "$dbuser" "$dbpass" mysql -uroot nextcloud < "$datadir"/dietpi-nextcloud-database-backup.sql else local username="$(grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_NEXTCLOUD_USERNAME=' /DietPi/dietpi.txt | sed 's/^.*=//')" [ -n "$username" ] || username='admin' # For MariaDB, temporary database admin user needs to be created, as 'root' uses unix_socket login, which cannot be accessed by sudo -u www-data. mysql -e "grant all privileges on *.* to 'tmp_root'@'localhost' identified by '$GLOBAL_PW' with grant option" grep -q "'installed' => true," $config_php 2>/dev/null || ncc maintenance:install --no-interaction --database "mysql" --database-name "nextcloud" --database-user "tmp_root" --database-pass "$GLOBAL_PW" --admin-user "$username" --admin-pass "$GLOBAL_PW" --data-dir "$datadir" mysql -e "drop user 'tmp_root'@'localhost'" fi fi # Enable Nextcloud to use 4-byte database grep -q "^[[:blank:]]*'mysql.utf8mb4'" $config_php || sed -i "/^[[:blank:]]*'dbpassword'/a \ \ 'mysql.utf8mb4' => true," $config_php # Disable trusted_domains. if (( ! $(cat $config_php | grep -ci -m1 "1 => '*'") )); then sed -i "/0 => 'localhost'/a 1 => '*'," $config_php fi # Set CLI URL to Nextcloud sub directory: 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 grep -q "^[[:blank:]]*'htaccess.RewriteBase'" $config_php || sed -i "/^[[:blank:]]*'overwrite.cli.url'/a \ \ 'htaccess.RewriteBase' => '/nextcloud'," $config_php ncc maintenance:update:htaccess fi # APCu Memcache grep -q "^[[:blank:]]*'memcache.local'" $config_php || sed -i "/^[[:blank:]]*'version'/a \ \ 'memcache.local' => '\\\OC\\\Memcache\\\APCu'," $config_php # Redis for transactional file locking: # https://docs.nextcloud.com/server/12/admin_manual/configuration_files/files_locking_transactional.html # - Enable Redis socket and grant www-data access to it: local redis_conf="/etc/redis/redis*.conf" grep -q "^[[:blank:]]*unixsocket /" $redis_conf || grep -q '^[[:blank:]]*#unixsocket /' $redis_conf && sed -i 's|^[[:blank:]]*#unixsocket /|unixsocket /|' $redis_conf || echo 'unixsocket /var/run/redis/redis.sock' >> $redis_conf grep -q "^[[:blank:]]*#?unixsocketperm " $redis_conf && sed -i "/^[[:blank:]]*#?unixsocketperm /c\unixsocketperm 770" $redis_conf || echo 'unixsocketperm 770' >> $redis_conf local redis_sock=$(grep "^[[:blank:]]*unixsocket /" $redis_conf | sed "s/^[[:blank:]]*unixsocket //") usermod -a -G redis www-data # - Enable Nextloud to use Redis socket: if (( ! $(cat $config_php | grep -ci -m1 "'memcache.locking'") )); then sed -i "\#'memcache.local'#a \ \ 'filelocking.enabled' => true,\n\ 'memcache.locking' => '\\\OC\\\Memcache\\\Redis',\n\ 'redis' => array(\n\ 'host' => '$redis_sock',\n\ 'port' => 0,\n\ )," $config_php fi # Enable Nextcloud background cron job: crontab -u www-data -l 2>/dev/null | grep -q '/var/www/nextcloud/cron.php' || ( crontab -u www-data -l 2>/dev/null ; echo "*/15 * * * * php /var/www/nextcloud/cron.php" ) | crontab -u www-data - ncc background:cron # Enable maintenance mode to allow handling by dietpi-services: grep -q "^[[:blank:]]*'maintenance' => true," $config_php || ncc maintenance:mode --on fi # Transmission INSTALLING_INDEX=44 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Jessie, Transmission uses my systemd service: https://github.com/Fourdee/DietPi/issues/350#issuecomment-220828884 rm /etc/init.d/transmission-daemon rm /etc/systemd/system/transmission-daemon.service cat << _EOF_ > /etc/systemd/system/transmission-daemon.service [Unit] Description=Barebones transmission-daemon service DefaultDependencies=no [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/transmission-daemon --config-dir /var/lib/transmission-daemon/info ExecStop=/usr/bin/killall -w transmission-daemon StandardOutput=tty [Install] WantedBy=multi-user.target _EOF_ cat << _EOF_ > /etc/transmission-daemon/settings.json { "alt-speed-down": 50, "alt-speed-enabled": false, "alt-speed-time-begin": 540, "alt-speed-time-day": 127, "alt-speed-time-enabled": false, "alt-speed-time-end": 1020, "alt-speed-up": 50, "bind-address-ipv4": "0.0.0.0", "bind-address-ipv6": "::", "blocklist-enabled": false, "blocklist-url": "http://www.example.com/blocklist", "cache-size-mb": 48, "dht-enabled": true, "download-dir": "$G_FP_DIETPI_USERDATA/downloads", "download-limit": 100, "download-limit-enabled": false, "download-queue-enabled": true, "download-queue-size": 2, "encryption": 2, "idle-seeding-limit": 1, "idle-seeding-limit-enabled": true, "incomplete-dir": "$G_FP_DIETPI_USERDATA/bt-inprogress", "incomplete-dir-enabled": false, "lpd-enabled": false, "max-peers-global": 8, "message-level": 0, "peer-congestion-algorithm": "", "peer-limit-global": 8, "peer-limit-per-torrent": 5, "peer-port": 51413, "peer-port-random-high": 65535, "peer-port-random-low": 49152, "peer-port-random-on-start": false, "peer-socket-tos": "default", "pex-enabled": true, "port-forwarding-enabled": true, "preallocation": 1, "prefetch-enabled": 1, "queue-stalled-enabled": true, "queue-stalled-minutes": 30, "ratio-limit": 1.1, "ratio-limit-enabled": true, "rename-partial-files": true, "rpc-authentication-required": true, "rpc-bind-address": "0.0.0.0", "rpc-enabled": true, "rpc-password": "$GLOBAL_PW", "rpc-port": 9091, "rpc-url": "/transmission/", "rpc-username": "root", "rpc-whitelist": "192.*.*.*", "rpc-whitelist-enabled": false, "scrape-paused-torrents-enabled": true, "script-torrent-done-enabled": false, "script-torrent-done-filename": "", "seed-queue-enabled": false, "seed-queue-size": 10, "speed-limit-down": 100, "speed-limit-down-enabled": false, "speed-limit-up": 100, "speed-limit-up-enabled": false, "start-added-torrents": true, "trash-original-torrent-files": true, "umask": 18, "upload-limit": 100, "upload-limit-enabled": false, "upload-slots-per-torrent": 2, "utp-enabled": true } _EOF_ #Apply optimized settings sed -i '/cache-size-mb/c\ "cache-size-mb": '$(Optimize_BitTorrent 0)',' /etc/transmission-daemon/settings.json sed -i '/download-queue-size/c\ "download-queue-size": '$(Optimize_BitTorrent 1)',' /etc/transmission-daemon/settings.json sed -i '/peer-limit-global/c\ "peer-limit-global": '$(Optimize_BitTorrent 2)',' /etc/transmission-daemon/settings.json sed -i '/max-peers-global/c\ "max-peers-global": '$(Optimize_BitTorrent 2)',' /etc/transmission-daemon/settings.json sed -i '/peer-limit-per-torrent/c\ "peer-limit-per-torrent": '$(Optimize_BitTorrent 2)',' /etc/transmission-daemon/settings.json sed -i '/upload-slots-per-torrent/c\ "upload-slots-per-torrent": '$(Optimize_BitTorrent 3)',' /etc/transmission-daemon/settings.json fi #PHPBB INSTALLING_INDEX=54 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration /DietPi/dietpi/func/create_mysql_db phpbb3 phpbb3 "$GLOBAL_PW" fi #MPD INSTALLING_INDEX=128 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Create MPD env (based on moOde) #useradd mpd useradd -r -M mpd -G audio -s /usr/bin/nologin mkdir -p /var/lib/mpd mkdir -p /var/run/mpd mkdir -p /var/lib/mpd/music mkdir -p /var/lib/mpd/playlists touch /var/lib/mpd/state # Link /mnt to MPD defaults: https://github.com/Fourdee/DietPi/issues/1223#issuecomment-346955040 rm /var/lib/mpd/music/MNT &> /dev/null # Always recreate (reinstalls), else, mnt -> /mnt ln -sf /mnt /var/lib/mpd/music/MNT chown -R mpd:audio /var/lib/mpd mkdir -p /var/log/mpd touch /var/log/mpd/mpd.log chmod 644 /var/log/mpd/mpd.log chown -R mpd:audio /var/log/mpd # cache mkdir -p "$G_FP_DIETPI_USERDATA"/.mpd_cache #MPD service/confs cat << _EOF_ > /etc/default/mpd #Even though we declare the conf location in our service, MPD will fail to start if this file does not exist. ## The configuration file location for mpd: MPDCONF=/etc/mpd.conf _EOF_ cat << _EOF_ > /lib/systemd/system/mpd.service [Unit] Description=Music Player Daemon After=network.target sound.target [Service] User=root EnvironmentFile=/etc/default/mpd ExecStartPre=/bin/mkdir -p /var/run/mpd ExecStartPre=/bin/chown -R mpd:audio /var/run/mpd ExecStart=$(which mpd) --no-daemon /etc/mpd.conf [Install] WantedBy=multi-user.target _EOF_ #Copy default config cp /DietPi/dietpi/conf/mpd.conf /etc/mpd.conf chown mpd:audio /etc/mpd.conf chmod 0666 /etc/mpd.conf #JustBoom specials if (( $(cat /DietPi/dietpi.txt | grep -ci -m1 '^CONFIG_SOUNDCARD=justboom') )); then # - Name displayed in YMPD sound button local justboom_soundcard_desc='JustBoom DietPi' sed -i "/^name \"/c\name \"$justboom_soundcard_desc\"" /etc/mpd.conf sed -i "/^zeroconf_name \"/c\zeroconf_name \"$justboom_soundcard_desc\"" /etc/mpd.conf # - Output (192khz 32bit) local target_bitdepth=32 local target_rate=192000 sed -i '/^format "/c\format "'$target_rate':'$target_bitdepth':2"' /etc/mpd.conf sed -i '/audio_output_format "/c\audio_output_format "'$target_rate':'$target_bitdepth':2"' /etc/mpd.conf # - Set SOXR quality # All RPi's can handle SOXR VH @ 192khz 32bit: https://github.com/Fourdee/DietPi/issues/581#issuecomment-256643079 sed -i '/samplerate_converter "/c\samplerate_converter "soxr very high"' /etc/mpd.conf #highest fi #Grab our test music for the user. Download_Test_Media fi # Proftpd INSTALLING_INDEX=94 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration sed -i "/root/c\#root" /etc/ftpusers cp /DietPi/dietpi/conf/proftpd.conf /etc/proftpd/proftpd.conf sed -i "/DefaultRoot /c\DefaultRoot $G_FP_DIETPI_USERDATA" /etc/proftpd/proftpd.conf fi #Samba Server INSTALLING_INDEX=96 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration echo -e "dietpi\ndietpi" | smbpasswd -s -a root cp /DietPi/dietpi/conf/smb.conf /etc/samba/smb.conf sed -i "/path = /c\path = $G_FP_DIETPI_USERDATA" /etc/samba/smb.conf fi #vsFTPD INSTALLING_INDEX=95 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration sed -i '/root/c\#root' /etc/ftpusers cp /DietPi/dietpi/conf/vsftpd.conf /etc/vsftpd.conf sed -i "/^local_root=/c\local_root=$G_FP_DIETPI_USERDATA" /etc/vsftpd.conf fi #NFS_SERVER INSTALLING_INDEX=109 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/exports $G_FP_DIETPI_USERDATA *(rw,async,no_root_squash,fsid=0,crossmnt,no_subtree_check) _EOF_ fi #YMPD INSTALLING_INDEX=32 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #YMPD service cat << _EOF_ > /etc/systemd/system/ympd.service [Unit] Description=YMPD After=mpd.service [Service] Type=simple User=root ExecStart=/usr/bin/ympd --user root --webport 1337 [Install] WantedBy=multi-user.target _EOF_ fi #Roon Bridge INSTALLING_INDEX=121 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration mkdir -p "$G_FP_DIETPI_USERDATA"/roon cp /DietPi/dietpi/conf/roonbridge.service /etc/systemd/system/roonbridge.service # - Move logfiles to /var/log/ (dietpi-ramlog) # Remove any previous folders to clear for symlink rm -R "$G_FP_DIETPI_USERDATA"/roon/RoonBridge/Logs &> /dev/null rm -R "$G_FP_DIETPI_USERDATA"/roon/RAATServer/Logs &> /dev/null mkdir -p "$G_FP_DIETPI_USERDATA"/roon/RoonBridge mkdir -p "$G_FP_DIETPI_USERDATA"/roon/RAATServer ln -sf /var/log "$G_FP_DIETPI_USERDATA"/roon/RoonBridge/Logs ln -sf /var/log "$G_FP_DIETPI_USERDATA"/roon/RAATServer/Logs fi #NodeRed INSTALLING_INDEX=122 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration mkdir -p "$G_FP_DIETPI_USERDATA"/node-red adduser nodered --system --group --no-create-home --shell=/bin/nologin cat << _EOF_ > /etc/systemd/system/node-red.service [Unit] Description=Node-Red [Service] Type=simple User=nodered ExecStart=/usr/local/bin/node-red -u $G_FP_DIETPI_USERDATA/node-red [Install] WantedBy=multi-user.target _EOF_ #Symlink to home dir: https://github.com/Fourdee/DietPi/issues/1256 ln -sf "$G_FP_DIETPI_USERDATA"/node-red "$HOME"/.node-red fi #Tomcat8 INSTALLING_INDEX=125 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration sed -i "/JAVA_HOME=/c\JAVA_HOME=$(find \/usr\/lib\/jvm\/ -name java-8-openjdk*)" /etc/default/tomcat8 fi #CAVA INSTALLING_INDEX=119 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Cava conf mkdir -p "$HOME"/.config/cava cp /DietPi/dietpi/conf/cava.conf "$HOME"/.config/cava/config # - lower MPD buffer size to reduce latency of spectrum: sed -i '/audio_buffer_size /c\audio_buffer_size "384"' /etc/mpd.conf # - fifo stream for mpd if (( ! $(cat /etc/mpd.conf | grep -ci -m1 '/tmp/mpd.fifo') )); then cat << _EOF_ >> /etc/mpd.conf #Cava fifo stream audio_output { type "fifo" enabled "yes" name "CAVA" path "/tmp/mpd.fifo" format "44100:16:2" } _EOF_ fi fi #Mopidy INSTALLING_INDEX=118 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration sed -i "/User=/c\User=root" /lib/systemd/system/mopidy.service # - conf mkdir -p "$G_FP_DIETPI_USERDATA"/mopidy/cache mkdir -p "$G_FP_DIETPI_USERDATA"/mopidy/data mkdir -p ~/.config/mopidy cat << _EOF_ > ~/.config/mopidy/mopidy.conf [core] cache_dir = $G_FP_DIETPI_USERDATA/mopidy/cache config_dir = /etc/mopidy data_dir = $G_FP_DIETPI_USERDATA/mopidy/data [logging] config_file = /etc/mopidy/logging.conf debug_file = /var/log/mopidy.log [local] library = images media_dir = /mnt enabled = true scan_timeout = 1000 scan_flush_threshold = 100 scan_follow_symlinks = false excluded_file_extensions = .directory .html .jpeg .jpg .log .nfo .png .txt [file] enabled = true media_dirs = /mnt [m3u] playlists_dir = /mnt [http] enabled = true hostname = :: port = 6680 static_dir = zeroconf = Mopidy HTTP server on $hostname _EOF_ # NB: mopidy uses both config locations, so lets make sure we match them cp ~/.config/mopidy/mopidy.conf /etc/mopidy/mopidy.conf Download_Test_Media fi #Kodi INSTALLING_INDEX=31 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Remove Kodi user (Whilst waving) userdel -r kodi &> /dev/null #Run Kodi as root sed -i '/USER=/c\USER=root' /etc/default/kodi &> /dev/null #Copy udev rules, probably not needed for root, but we'll do it anyway cp /DietPi/dietpi/conf/kodi_udev /etc/udev/rules.d/99-input.rules chmod +x /etc/udev/rules.d/99-input.rules #Create .desktop SymLinks mkdir -p "$HOME"/Desktop rm /usr/share/applications/kodi.desktop &> /dev/null wget http://dietpi.com/downloads/conf/desktop/kodi.desktop -O /usr/share/applications/kodi.desktop ln -sf /usr/share/applications/kodi.desktop "$HOME"/Desktop/kodi.desktop fi #MINIDLNA INSTALLING_INDEX=39 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Run as root sed -i '/USER=m/c\USER=root' /etc/init.d/minidlna # + SystemD sed -i '/User=m/c\User=root' /lib/systemd/system/minidlna.service &> /dev/null sed -i '/Group=m/c\Group=root' /lib/systemd/system/minidlna.service &> /dev/null #Copy Config cp /DietPi/dietpi/conf/minidlna.conf /etc/minidlna.conf #Setup data directories mkdir -p "$G_FP_DIETPI_USERDATA"/.MiniDLNA_Cache fi #NoIp INSTALLING_INDEX=67 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #noip2 service file cat << _EOF_ > /etc/systemd/system/noip2.service [Unit] Description=noip2 After=network.target network-online.target rsyslog.service [Service] Type=forking RemainAfterExit=yes ExecStart=/usr/local/bin/noip2 ExecStop=/usr/bin/killall -w noip2 [Install] WantedBy=multi-user.target _EOF_ fi #amiberry INSTALLING_INDEX=108 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Allow binary execution chmod -R +x /etc/amiberry #Create userdata/rom directories and symlink from /etc/amiberry/ mkdir -p "$G_FP_DIETPI_USERDATA"/amiberry #Copy default configs, then setup symlinks from Uae4ARM folders to userdata. # - Conf cp -R /etc/amiberry/conf "$G_FP_DIETPI_USERDATA"/amiberry/ rm -R /etc/amiberry/conf &> /dev/null ln -sf "$G_FP_DIETPI_USERDATA"/amiberry/conf /etc/amiberry/conf # - Disks rm -R /etc/amiberry/disks &> /dev/null mkdir -p "$G_FP_DIETPI_USERDATA"/amiberry/disks ln -sf "$G_FP_DIETPI_USERDATA"/amiberry/disks /etc/amiberry/disks # - floppy_images rm -R /etc/amiberry/floppy_images &> /dev/null mkdir -p "$G_FP_DIETPI_USERDATA"/amiberry/floppy_images ln -sf "$G_FP_DIETPI_USERDATA"/amiberry/floppy_images /etc/amiberry/floppy_images cat << _EOF_ > "$G_FP_DIETPI_USERDATA"/amiberry/floppy_images/dir.txt Put your Amiga floopy images (*.adf) in this directory. _EOF_ # - HDF rm -R /etc/amiberry/hdf &> /dev/null mkdir -p "$G_FP_DIETPI_USERDATA"/amiberry/hdf ln -sf "$G_FP_DIETPI_USERDATA"/amiberry/hdf /etc/amiberry/hdf # - Kickstarts rm -R /etc/amiberry/kickstarts &> /dev/null mkdir -p "$G_FP_DIETPI_USERDATA"/amiberry/kickstarts ln -sf "$G_FP_DIETPI_USERDATA"/amiberry/kickstarts /etc/amiberry/kickstarts cat << _EOF_ > "$G_FP_DIETPI_USERDATA"/amiberry/kickstarts/dir.txt Put your Kickstart Roms (*.rom) in this directory. They should be named accordingly depending on version: kick12.rom , kick13.rom , kick20.rom, kick31.rom _EOF_ # - Savestates rm -R /etc/amiberry/savestates &> /dev/null mkdir -p "$G_FP_DIETPI_USERDATA"/amiberry/savestates ln -sf "$G_FP_DIETPI_USERDATA"/amiberry/savestates /etc/amiberry/savestates cat << _EOF_ > "$G_FP_DIETPI_USERDATA"/amiberry/savestates/dir.txt Saved states will be stored here. _EOF_ # - Screenshots rm -R /etc/amiberry/screenshots &> /dev/null mkdir -p "$G_FP_DIETPI_USERDATA"/amiberry/screenshots ln -sf "$G_FP_DIETPI_USERDATA"/amiberry/screenshots /etc/amiberry/screenshots cat << _EOF_ > "$G_FP_DIETPI_USERDATA"/amiberry/screenshots/dir.txt Screenshots will be stored here. _EOF_ #Uae4arm does not support browsing symlinks (https://github.com/Fourdee/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 sed -i "s:$G_FP_DIETPI_USERDATA:$fp_userdata_actual:g" "$G_FP_DIETPI_USERDATA"/amiberry/conf/adfdir.conf sed -i "s:$G_FP_DIETPI_USERDATA:$fp_userdata_actual:g" "$G_FP_DIETPI_USERDATA"/amiberry/conf/autostart.uae fi #Symlink HW specific binary for this system to /etc/amiberry/amiberry local amiberry_filename='amiberry-rpi' # - RPi 3 if (( $G_HW_MODEL == 3 )); then amiberry_filename+='3' # - RPi 2 elif (( $G_HW_MODEL == 2 )); then amiberry_filename+='2' # - Assume RPi 1 (ARMv6) else amiberry_filename+='1' fi ln -sf /etc/amiberry/"$amiberry_filename" /etc/amiberry/amiberry # + SDL2 amiberry_filename+='-sdl2' ln -sf /etc/amiberry/"$amiberry_filename" /etc/amiberry/amiberry-sdl2 #service SDL1 cat << _EOF_ > /etc/systemd/system/amiberry.service [Unit] Description=AmiBerry Amiga Emulator DefaultDependencies=no [Service] Type=simple User=root WorkingDirectory=/etc/amiberry ExecStart=/bin/bash -c ./amiberry_run.sh [Install] WantedBy=local-fs.target _EOF_ systemctl daemon-reload cat << _EOF_ > /etc/amiberry/amiberry_run.sh #!/bin/bash if (( \$(ps aux | grep -ci -m1 '[X]11') )); then ./amiberry -f conf/autostart.uae else xinit ./amiberry -f conf/autostart.uae fi _EOF_ chmod +x /etc/amiberry/amiberry_run.sh #service SDL2 cat << _EOF_ > /etc/systemd/system/amiberry-sdl2.service [Unit] Description=AmiBerry Amiga Emulator [Service] Type=simple User=root WorkingDirectory=/etc/amiberry ExecStart=/bin/bash -c ./amiberry_run_sdl2.sh [Install] WantedBy=local-fs.target _EOF_ systemctl daemon-reload #DEBUG #systemctl restart amiberry-sdl2 cat << _EOF_ > /etc/amiberry/amiberry_run_sdl2.sh #!/bin/bash xinit ./amiberry-sdl2 -f conf/autostart.uae _EOF_ chmod +x /etc/amiberry/amiberry_run_sdl2.sh fi #dxx-rebirth INSTALLING_INDEX=112 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Symlink savegames to root # - Remove existing syslinks rm -R "$HOME"/.d1x-rebirth &> /dev/null rm -R "$HOME"/.d2x-rebirth &> /dev/null ln -sf "$G_FP_DIETPI_USERDATA"/dxx-rebirth/descent_1_profiles "$HOME"/.d1x-rebirth ln -sf "$G_FP_DIETPI_USERDATA"/dxx-rebirth/descent_2_profiles "$HOME"/.d2x-rebirth #+exe chmod +x -R "$G_FP_DIETPI_USERDATA"/dxx-rebirth/* #Create .Desktop SymLinks mkdir -p "$HOME"/Desktop mkdir -p /usr/share/applications ln -s "$G_FP_DIETPI_USERDATA"/dxx-rebirth/dxx-rebirth.desktop "$HOME"/Desktop/dxx-rebirth.desktop ln -s "$G_FP_DIETPI_USERDATA"/dxx-rebirth/dxx-rebirth.desktop /usr/share/applications/dxx-rebirth.desktop fi #OpenTyrian INSTALLING_INDEX=51 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Copy the DietPi run file for OpenTyrian cp /DietPi/dietpi/conf/opentyrian_run /usr/local/games/opentyrian/run chmod +x /usr/local/games/opentyrian/run #Create .Desktop SymLinks mkdir -p "$HOME"/Desktop rm /usr/share/applications/opentyrian.desktop &> /dev/null wget http://dietpi.com/downloads/conf/desktop/pcmanfm.conf -O /usr/share/applications/opentyrian.desktop ln -s /usr/share/applications/opentyrian.desktop "$HOME"/Desktop/opentyrian.desktop fi #DIETPICAM INSTALLING_INDEX=59 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - raspimjpeg conf chmod +x /etc/raspimjpeg ln -s /etc/raspimjpeg /var/www/dietpicam/raspimjpeg # - Motion conf chgrp www-data /etc/motion/motion.conf chmod 777 /etc/motion/motion.conf usermod -a -G video www-data # - raspimjpeg/php schedule startup and control script cp /DietPi/dietpi/conf/raspimjpeg.service /var/lib/dietpi/dietpi-software/services/raspimjpeg.service # - Setup Data directory local dietpicam_media_directory=$G_FP_DIETPI_USERDATA mkdir -p "$dietpicam_media_directory"/dietpicam rm -R /var/www/dietpicam/media ln -s "$dietpicam_media_directory"/dietpicam /var/www/dietpicam/media # - Enable RPi camera /DietPi/dietpi/func/dietpi-set_hardware rpi-camera enable fi #Deluge INSTALLING_INDEX=45 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #copy init cp /DietPi/dietpi/conf/deluge.service /var/lib/dietpi/dietpi-software/services/deluge.service #Generate deluge default config deluged killall -w deluged #Copy DietPi configs cp /DietPi/dietpi/conf/deluge.conf "$HOME"/.config/deluge/core.conf cp /DietPi/dietpi/conf/deluge_web.conf "$HOME"/.config/deluge/web.conf #Set remote access login details cat << _EOF_ > "$HOME"/.config/deluge/auth root:$GLOBAL_PW:10 _EOF_ #Apply Optimized settings # - Cache size is in steps of 16 KiB. (Cachesize * 16 = total KiB) local deluge_cache_size=$(( $(echo -e "scale=0; $(Optimize_BitTorrent 0) * 1024 / 16" | bc -l ) )) sed -i '/"cache_size": /c\ "cache_size": '"$deluge_cache_size"',' "$HOME"/.config/deluge/core.conf sed -i '/"max_active_limit": /c\ "max_active_limit": '"$(Optimize_BitTorrent 1)"',' "$HOME"/.config/deluge/core.conf sed -i '/"max_active_downloading": /c\ "max_active_downloading": '"$(Optimize_BitTorrent 1)"',' "$HOME"/.config/deluge/core.conf sed -i '/"max_connections_global": /c\ "max_connections_global": '"$(Optimize_BitTorrent 2)"',' "$HOME"/.config/deluge/core.conf sed -i '/"max_upload_slots_global": /c\ "max_upload_slots_global": '"$(Optimize_BitTorrent 3)"',' "$HOME"/.config/deluge/core.conf fi #RaspControl INSTALLING_INDEX=106 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Setup login file mkdir -p /etc/raspcontrol cat << _EOF_ > /etc/raspcontrol/database.aptmnt { "user": "root", "password": "$GLOBAL_PW" } _EOF_ chown -R www-data:www-data /etc/raspcontrol chmod -R 750 /etc/raspcontrol fi #PIHOLE INSTALLING_INDEX=93 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Create a symlink so users can use http://ip/pihole ln -sf /var/www/html/admin /var/www/pihole # - Create a symlink so users can use http://ip/admin ln -sf /var/www/html/admin /var/www/admin # - Generate index page that replaces adverts and prevents popups cat << _EOF_ > /var/www/index.html Blocked by Pi-hole. _EOF_ # - Generate pihole.log , set permissions to www-data echo -e "" > /var/log/pihole.log chown www-data:www-data /var/log/pihole.log chmod 775 /var/log/pihole.log # - Generate web interface PW: https://github.com/Fourdee/DietPi/issues/662 pihole -a -p "$GLOBAL_PW" # - PiHole now generates a password, inform user of the correct one: whiptail --title "PiHole: Web interface" --msgbox "DietPi has changed the PiHole web interface password to:\n- $GLOBAL_PW\n\nPlease use this password when logging into the web interface:\n - http://ip/pihole\n\nThis password can be changed, please see pihole binary for info:\n - pihole --help" --backtitle "$WHIP_BACKTITLE" 16 70 fi #SUBSONIC 5/6 INSTALLING_INDEX=34 if (( ${aSOFTWARE_INSTALL_STATE[33]} == 1 || ${aSOFTWARE_INSTALL_STATE[34]} == 1 )); then Banner_Configuration #Optimize memory limit local subsonic_memory_max=$(( $RAM_TOTAL / 5 )) #Minimum cap 150mb if (( $subsonic_memory_max < 150 )); then subsonic_memory_max=150 fi 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_ #Grab our test media for user Download_Test_Media #Symlink ffmpeg to subsonic transcoder #rpi armv6 jessie (using compiled ffmpeg) if (( $G_HW_MODEL < 2 )); then ln -fs /usr/local/bin/ffmpeg /var/subsonic/transcode #ARMv7 else ln -fs /usr/bin/ffmpeg /var/subsonic/transcode fi fi #WEBIOPI INSTALLING_INDEX=71 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #auto start update-rc.d webiopi defaults WEBIOPI=2 fi #DIETPICLOUDSHELL INSTALLING_INDEX=62 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Enable DietPi-Cloudshell autostart /DietPi/dietpi/dietpi-autostart 5 #Service cat << _EOF_ > /etc/systemd/system/dietpi-cloudshell.service [Unit] Description=dietpi-cloudshell on main screen [Service] Type=simple StandardOutput=tty TTYPath=/dev/tty1 ExecStartPre=/usr/bin/setterm --term linux --blank 0 --powersave off --cursor off ExecStart=/bin/bash -c '/DietPi/dietpi/dietpi-cloudshell 1' ExecStop=/usr/bin/setterm --reset ExecStop=/bin/bash -c 'G_DIETPI-NOTIFY 0 DietPi-Cloudshell terminated, have a nice day!' [Install] WantedBy=multi-user.target _EOF_ systemctl daemon-reload fi #HAPROXY INSTALLING_INDEX=98 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Create jail directory mkdir -p /var/lib/haproxy cat << _EOF_ > /etc/haproxy/haproxy.cfg global #rsyslog is required for logging #log /var/log local0 #log /var/log local1 notice maxconn 64 #Jail directory chroot /var/lib/haproxy stats socket /run/haproxy.sock mode 660 level admin stats timeout 30s user root group root daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend localnodes bind *:80 mode http default_backend nodes backend nodes mode http balance roundrobin option forwardfor http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } option httpchk HEAD / HTTP/1.1\r\nHost:localhost server web01 127.0.0.1:9000 check server web02 127.0.0.1:9001 check server web03 127.0.0.1:9002 check #Admin web page listen stats bind *:1338 stats enable stats uri / stats hide-version stats auth admin:dietpi _EOF_ #Add html error pages mkdir -p /etc/haproxy/errors local errorcode=0 errorcode=400; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http errorcode=403; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http errorcode=408; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http errorcode=500; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http errorcode=502; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http errorcode=503; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http errorcode=504; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http fi #SQUEEZEBOXSERVER INSTALLING_INDEX=35 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Remove service update-rc.d logitechmediaserver remove rm /etc/init.d/logitechmediaserver #DietPi-Services init cp /DietPi/dietpi/conf/squeezeboxserver.service /var/lib/dietpi/dietpi-software/services/squeezeboxserver.service #Grab our test media for user Download_Test_Media fi #WORDPRESS INSTALLING_INDEX=55 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Create mysql DB /DietPi/dietpi/func/create_mysql_db wordpress wordpress "$GLOBAL_PW" fi #TIGHTVNCSERVER / VNC4SERVER / RealVNC - Shared setup #INSTALLING_INDEX=27/28/120 if (( ${aSOFTWARE_INSTALL_STATE[27]} == 1 || ${aSOFTWARE_INSTALL_STATE[28]} == 1 || ${aSOFTWARE_INSTALL_STATE[120]} == 1 )); then #Banner_Configuration #User, enter PW if (( $G_USER_INPUTS )); then local entering_pw=1 local loop_count=0 # - RealVNC uses Unix account if (( ${aSOFTWARE_INSTALL_STATE[120]} == 1 )); then entering_pw=0 else WHIP_QUESTION='A password is required for your VNC Server.\n\nThe next screen will allow you to set your password, this password will be used when connecting from a VNC client/viewer.\n\nPress Ok/Enter when ready.' whiptail --title "VNC Server Password" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 13 70 fi while (( $entering_pw == 1 )); do vncpasswd ((loop_count++)) # - Password file created if [ -f "$HOME"/.vnc/passwd ]; then entering_pw=0 # - Endless loop elif (( $loop_count >= 30 )); then entering_pw=0 fi done fi cat << _EOF_ > /etc/systemd/system/vncserver.service [Unit] Description=Manage VNC Server After=dietpi-service.service After=rc.local.service [Service] Type=idle RemainAfterExit=yes ExecStart=/bin/bash /usr/local/bin/vncserver start ExecStop=/bin/bash /usr/local/bin/vncserver stop User=root [Install] WantedBy=multi-user.target _EOF_ systemctl enable vncserver.service systemctl daemon-reload cat << _EOF_ > /usr/local/bin/vncserver #!/bin/bash #Globals VNC_INSTALLED=0 BINARY_FP=0 SHARED_MODE=0 WIDTH=\$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_VNCSERVER_WIDTH=' | sed 's/.*=//') HEIGHT=\$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_VNCSERVER_HEIGHT=' | sed 's/.*=//') DEPTH=\$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_VNCSERVER_DEPTH=' | sed 's/.*=//') DISPLAY=\$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_VNCSERVER_DISPLAY_INDEX=' | sed 's/.*=//') SHARED_MODE=\$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_VNCSERVER_SHARE_DESKTOP=' | sed 's/.*=//') #RealVNC | Slightly different launch method to VNC4server REALVNC=0 if (( \$(dpkg --get-selections | grep -ci -m1 '^realvnc-vnc-server') )); then REALVNC=1 #Set shared desktop mode if autostart is enabled for desktops. This prevents another VNC server being launched on :1. if (( \$(cat /DietPi/dietpi/.dietpi-autostart_index) == 2 )); then SHARED_MODE=1 fi fi #Find binary FP to use if [ -f /usr/bin/tigervncserver ]; then BINARY_FP='/usr/bin/tigervncserver' VNC_INSTALLED=1 elif [ -f /usr/bin/vnc4server ]; then BINARY_FP='/usr/bin/vnc4server' VNC_INSTALLED=1 elif [ -f /usr/bin/vncserver ]; then BINARY_FP='/usr/bin/vncserver' VNC_INSTALLED=1 fi #Exit if no VNC binary found if (( ! \$VNC_INSTALLED )); then exit 1 fi case "\$1" in start) if (( \$SHARED_MODE )); then # - excluding RealVNC as it has its own services if (( ! \$REALVNC )); then #wait for X to start while (( ! \$(ps aux | grep -ci -m1 '[/]usr/bin/X') )) do sleep 3 done xset dpms force on #disable screen blanking x11vnc -display :0 -usepw -forever & fi else \$BINARY_FP :\$DISPLAY -geometry \$WIDTH'x'\$HEIGHT -depth \$DEPTH fi ;; stop) \$BINARY_FP -kill :\$DISPLAY &> /dev/null killall -w x11vnc &> /dev/null killall -w Xtigervnc &> /dev/null ;; esac exit 0 _EOF_ chmod +x /usr/local/bin/vncserver # + RealVNC | enable services if (( ${aSOFTWARE_INSTALL_STATE[120]} == 1 )); then systemctl enable vncserver-x11-serviced.service systemctl enable vncserver-virtuald.service fi # - Stretch + TigerVNC: Disable Localhost only by default if (( $G_DISTRO >= 4 )); then echo -e '$localhost = "no";' >> /etc/vnc.conf fi fi #VNC4SERVER / RealVNC INSTALLING_INDEX=28 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} >= 1 || ${aSOFTWARE_INSTALL_STATE[120]} >= 1 )); then Banner_Configuration local cmd_launch_desktop='' #DESKTOP_LXDE if (( ${aSOFTWARE_INSTALL_STATE[23]} >= 1 )); then cmd_launch_desktop='/usr/bin/lxsession -s LXDE &' #DESKTOP_MATE elif (( ${aSOFTWARE_INSTALL_STATE[24]} >= 1 )); then cmd_launch_desktop='x-window-manager &' #DESKTOP_GNUSTEP elif (( ${aSOFTWARE_INSTALL_STATE[26]} >= 1 )); then cmd_launch_desktop='x-window-manager &' #DESKTOP_XFCE elif (( ${aSOFTWARE_INSTALL_STATE[25]} >= 1 )); then cmd_launch_desktop='/usr/bin/xfce4-session &' fi mkdir -p "$HOME"/.vnc cat << _EOF_ > "$HOME"/.vnc/xstartup [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r /root/.Xresources ] && xrdb /root/.Xresources xsetroot -solid grey vncconfig -iconic & $cmd_launch_desktop _EOF_ chmod +x "$HOME"/.vnc/xstartup fi #FAIL2BAN INSTALLING_INDEX=73 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # Generate log echo 0 > /var/log/auth.log 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 = auto 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 = 6 [dropbear] enabled = true port = ssh filter = dropbear logpath = /var/log/auth.log maxretry = 6 _EOF_ fi #PHPSYSINFO INSTALLING_INDEX=64 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #conf cp /DietPi/dietpi/conf/phpsysinfo.ini /var/www/phpsysinfo/phpsysinfo.ini fi #PHPIMAGEGALLERY INSTALLING_INDEX=56 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Get test images mkdir -p /var/www/gallery/DietPi wget http://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 #permissions for cache/thumbnail/database mkdir -p /var/www/gallery/_sfpg_data #enable (Some type of security trigger) sed -i "/define('SECURITY_PHRASE'/c\define('SECURITY_PHRASE', 'true');" /var/www/gallery/index.php fi #AMPACHE INSTALLING_INDEX=40 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration Download_Test_Media #create/insert our pre-made ampache sql db G_RUN_CMD wget http://dietpi.com/downloads/mysql_databases/ampache_mysql_3.8.2-v6.0.zip -O sql.zip unzip -o sql.zip rm sql.zip /DietPi/dietpi/func/create_mysql_db ampache ampache "$GLOBAL_PW" mysql ampache < ampache.sql rm ampache.sql #Grab config G_RUN_CMD wget http://dietpi.com/downloads/conf/ampache.cfg.php_3.8.2-v6.0 -O /var/www/ampache/config/ampache.cfg.php fi #OPENVPNSERVER INSTALLING_INDEX=97 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration local key_size=1024 #Start Cert/Key generation. cp -R /usr/share/easy-rsa/ /etc/openvpn mkdir -p /etc/openvpn/easy-rsa/keys cat << _EOF_ >> /etc/openvpn/easy-rsa/vars export KEY_SIZE=$key_size export KEY_COUNTRY="UK" export KEY_PROVINCE="DietPi" export KEY_CITY="DietPi" export KEY_ORG="DietPi" export KEY_EMAIL="noreply@DietPi.com" export KEY_OU="DietPi" export KEY_NAME="DietPi_OpenVPN_Server" _EOF_ #Create Server Cert Auth G_DIETPI-NOTIFY 2 "Generating unique OpenVPN certificates and keys. Please wait...\n" openssl dhparam -out /etc/openvpn/dh"$key_size".pem "$key_size" #Build Server certs/keys chmod -R +x /etc/openvpn/easy-rsa cd /etc/openvpn/easy-rsa . ./vars ./clean-all ./build-ca --batch DietPi_OpenVPN_Server ./build-key-server --batch DietPi_OpenVPN_Server #Copy Server cert/keys cp /etc/openvpn/easy-rsa/keys/{DietPi_OpenVPN_Server.crt,DietPi_OpenVPN_Server.key,ca.crt} /etc/openvpn/ #Build client cert/keys ./build-key --batch DietPi_OpenVPN_Client cd .. #End Cert/Key generation. #Server config cat << _EOF_ > /etc/openvpn/server.conf port 1194 proto udp dev tun ca ca.crt cert DietPi_OpenVPN_Server.crt key DietPi_OpenVPN_Server.key dh dh$key_size.pem server 10.8.0.0 255.255.255.0 client-to-client keepalive 10 60 comp-lzo max-clients 10 user nobody group nogroup persist-key persist-tun verb 3 #Web Forwarding (uncomment to enable) #push "redirect-gateway" #push "dhcp-option DNS 10.8.0.1" _EOF_ #Client config cat << _EOF_ > /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn client proto udp dev tun #Ip/Domain name of DietPi system, running OpenVPN server. remote mywebsite.com 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ns-cert-type server comp-lzo verb 3 _EOF_ #Unified client file. Add DietPi generated certs/keys. # - Add Server Cert auth echo '' >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn cat /etc/openvpn/ca.crt >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn echo '' >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn # - Add Client Cert echo '' >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn cat /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.crt >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn echo '' >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn # - Add Client Key echo '' >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn cat /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.key >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn echo '' >> /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn #Copy client file to userdata location cp /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn "$G_FP_DIETPI_USERDATA"/ # - and /boot partition cp /etc/openvpn/easy-rsa/keys/DietPi_OpenVPN_Client.ovpn /boot/ #enable ipv4 forwarding sed -i '/net.ipv4.ip_forward=/c\net.ipv4.ip_forward=1' /etc/sysctl.conf #Web Fowarding (Setup IPtables, must also be run during boot) #iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o "$(sed -n 3p /DietPi/dietpi/.network)" -j MASQUERADE fi #WIFIHOTSPOT INSTALLING_INDEX=60 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration local eth_index=$(sed -n 1p /DietPi/dietpi/.network) local wifi_index=$(sed -n 2p /DietPi/dietpi/.network) # - DHCPD Config cat << _EOF_ > /etc/dhcp/dhcpd.conf ddns-update-style none; default-lease-time 600; max-lease-time 7200; authoritative; log-facility local7; subnet 192.168.42.0 netmask 255.255.255.0 { range 192.168.42.10 192.168.42.50; option broadcast-address 192.168.42.255; option routers 192.168.42.1; option domain-name "local"; option domain-name-servers 8.8.8.8, 8.8.4.4; } _EOF_ # - Assign wlan as interface for dhcp server. cat << _EOF_ > /etc/default/isc-dhcp-server INTERFACES="wlan$wifi_index" _EOF_ # - Remove all entries below wlan, so we can recreate them. sed -i '/allow-hotplug wlan/q0' /etc/network/interfaces # - enable up wlan sed -i "/allow-hotplug wlan/c\allow-hotplug wlan$wifi_index" /etc/network/interfaces # - Add wifi settings to network interfaces config cat << _EOF_ >> /etc/network/interfaces iface wlan$wifi_index inet static address 192.168.42.1 netmask 255.255.255.0 #gateway 192.168.0.1 wireless-power off #dns-nameservers 8.8.8.8 8.8.4.4 # IP tables up iptables-restore < /etc/iptables.ipv4.nat _EOF_ # - Assign static IP for wlan now ifconfig wlan$wifi_index 192.168.42.1 # - Create access point config cat << _EOF_ > /etc/hostapd/hostapd.conf interface=wlan$wifi_index driver=nl80211 ssid=$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_WIFI_HOTSPOT_SSID=' | sed 's/.*=//') hw_mode=g channel=$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_WIFI_HOTSPOT_CHANNEL=' | sed 's/.*=//') macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_WIFI_HOTSPOT_KEY=' | 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 # - Enable access point config cat << _EOF_ > /etc/default/hostapd DAEMON_CONF="/etc/hostapd/hostapd.conf" _EOF_ # - Enable IPv4 forwarding sed -i "/net.ipv4.ip_forward=/c\net.ipv4.ip_forward=1" /etc/sysctl.conf echo 1 > /proc/sys/net/ipv4/ip_forward # - Apply iptables iptables -t nat -A POSTROUTING -o eth$eth_index -j MASQUERADE iptables -A FORWARD -i eth$eth_index -o wlan$wifi_index -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i wlan$wifi_index -o eth$eth_index -j ACCEPT # - 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 echo -e "ieee80211n=1" >> /etc/hostapd/hostapd.conf fi fi #TORHOTSPOT INSTALLING_INDEX=61 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Tor config cat << _EOF_ > /etc/tor/torrc Log notice file /var/log/tor/notices.log VirtualAddrNetwork 10.192.0.0/10 AutomapHostsSuffixes .onion,.exit AutomapHostsOnResolve 1 TransPort 9040 TransListenAddress 192.168.42.1 DNSPort 53 DNSListenAddress 192.168.42.1 _EOF_ # - Flush IP tables iptables -F iptables -t nat -F # - Generate tor prerouting tables local wifi_index=$(sed -n 2p /DietPi/dietpi/.network) iptables -t nat -A PREROUTING -i wlan$wifi_index -p tcp --dport 22 -j REDIRECT --to-ports 22 iptables -t nat -A PREROUTING -i wlan$wifi_index -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -t nat -A PREROUTING -i wlan$wifi_index -p tcp --syn -j REDIRECT --to-ports 9040 # - Save iptables-save > /etc/iptables.ipv4.nat # - Generate Logfile mkdir -p /var/log/tor echo 0 > /var/log/tor/notices.log chown -R debian-tor:nogroup /var/log/tor/notices.log # - User: Test tor is functional. #https://check.torproject.org fi #SHAIRPORTSYNC INSTALLING_INDEX=37 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Enable SOXR by default: cat << _EOF_ > /usr/local/etc/shairport-sync.conf general = { name = "%H"; interpolation = "soxr"; }; metadata = { enabled = "yes"; include_cover_art = "no"; pipe_name = "/tmp/shairport-sync-metadata"; pipe_timeout = 5000; socket_address = "226.0.0.1"; socket_port = 5555; socket_msglength = 65000; }; alsa = { // mixer_control_name = "PCM"; // output_rate = 44100; // can be 44100, 88200, 176400 or 352800 // output_format = "S16"; // can be "U8", "S8", "S16", "S24", "S24_3LE", "S24_3BE" or "S32" }; _EOF_ #Create shairport user groupadd -r shairport-sync &> /dev/null useradd -r -M -g shairport-sync -s /usr/bin/nologin -G audio shairport-sync &> /dev/null chmod +x /usr/local/bin/shairport-sync fi #BRUTEFIR INSTALLING_INDEX=38 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Copy configs and services cp /DietPi/dietpi/conf/brutefir_config /etc/BruteFIR/ cp /DietPi/dietpi/conf/brutefir.service /var/lib/dietpi/dietpi-software/services/brutefir.service #Modules echo -e "snd-aloop" > /etc/modules-load.d/brutefir-alsa-loopback.conf echo -e "options snd-aloop id=BruteFIR enable=1 pcm_substreams=1 pcm_notify=1" > /etc/modprobe.d/brutefir-alsa-loopback.conf #Asound.conf RPI cat << _EOF_ > /etc/asound.conf pcm.!default { type plug slave { pcm { type hw card "BruteFIR" device 0 channels 2 format "S16_LE" rate 44100 } } } ctl.!default { type hw card "BruteFIR" } _EOF_ fi #PYDIO INSTALLING_INDEX=48 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Configure apache2 # - Disable php output_buffering = sed -i '/output_buffering = /c\output_buffering = Off/' "$FP_PHP_BASE_DIR"/apache2/php.ini # - Allow overrides and redirects sed -i "/AllowOverride /c\ AllowOverride All" /etc/apache2/sites-enabled/000-default* # - +Jessie sed -i "/AllowOverride /c\ AllowOverride All" /etc/apache2/apache2.conf # - Enable apache2 rewrite engine a2enmod rewrite #Create Mysql DB /DietPi/dietpi/func/create_mysql_db pydio pydio "$GLOBAL_PW" #Setup Data directory local target_data_dir="$G_FP_DIETPI_USERDATA/pydio_data" # - Generate user data dir mkdir -p "$target_data_dir" # - move data structure mv /var/www/pydio/data/* "$target_data_dir"/ rm -R /var/www/pydio/data ln -sf "$target_data_dir" /var/www/pydio/data fi #SQUEEZELITE INSTALLING_INDEX=36 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Replace Sysinit service with SystemD echo -e "#This file is no longer used as service has been upgraded to SystemD.\n#Please see /etc/systemd/system/squeezelite.service to set start options" > /etc/default/squeezelite rm /etc/init.d/squeezelite cp /DietPi/dietpi/conf/squeezelite.service /etc/systemd/system/squeezelite.service Download_Test_Media fi #EMONHUB INSTALLING_INDEX=99 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Copy configs cp /etc/emonhub/conf/default/emonhub /etc/default/emonhub # - Setup service cp /etc/emonhub/service/emonhub /etc/init.d/emonhub chmod +x /etc/init.d/emonhub update-rc.d emonhub defaults chmod +x -R /etc/emonhub #RPI 3 - Must disable BCM BT to recover UART 0 if (( $G_HW_MODEL == 3 )); then # - Add DToverlay to disable bluetooth if (( $(cat /DietPi/config.txt | grep -ci -m1 '=pi3-disable-bt') == 0 )); then echo -e "\ndtoverlay=pi3-disable-bt" >> /DietPi/config.txt # - Enable else sed -i '/pi3-disable-bt/c\dtoverlay=pi3-disable-bt' /DietPi/config.txt fi # - Disable bluetooth service systemctl stop hciuart systemctl disable hciuart fi #RPi - Disable serial tty that emonPi uses. /DietPi/dietpi/func/dietpi-set_hardware serialconsole disable # - Apply user API KEY USER_EMONHUB_APIKEY_CURRENT=$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_EMONHUB_APIKEY=' | sed 's/.*=//') sed -i "/apikey/c\ apikey = $USER_EMONHUB_APIKEY_CURRENT" /etc/emonhub/conf/emonhub.conf fi #RPIMONITOR INSTALLING_INDEX=66 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Update apt package stats /usr/share/rpimonitor/scripts/updatePackagesStatus.pl # - USBdrive stats implimentation by Rich if (( $USBDRIVE )); then sed -i '\/include=\/etc\/rpimonitor\/template\/sdcard.conf/a include=\/etc\/rpimonitor\/template\/usb_hdd.conf' /etc/rpimonitor/data.conf cat << _EOF_ > /etc/rpimonitor/template/usb_hdd.conf ######################################################################## # Extract USB HDD (sda1) information # Page: 1 # Information Status Statistics # - USBHDD1 total - yes - yes # - USBHDD1 used - yes - yes ######################################################################## static.10.name=usbhdd_total static.10.source=df -t ext4 static.10.regexp=sda1\s+(\d+) static.10.postprocess=\$1/1024 dynamic.14.name=usbhdd_used dynamic.14.source=df -t ext4 dynamic.14.regexp=sda1\s+\d+\s+(\d+) dynamic.14.postprocess=\$1/1024 dynamic.14.rrd=GAUGE web.status.1.content.9.name=USB HDD web.status.1.content.9.icon=usb_hdd.png web.status.1.content.9.line.1="/sda1 Used: "+KMG(data.usbhdd_used,'M')+" ("+Percent(data.udbhdd_used,data.usbhdd_total,'M')+") Free: "+KMG(data.usbhdd_total-data.usbhdd_used,'M')+ " Total: "+ KMG(data.usbhdd_total,'M') +"" web.status.1.content.9.line.2=ProgressBar(data.usbhdd_used,data.usbhdd_total) web.statistics.1.content.9.name=USB HDD web.statistics.1.content.9.graph.1=usbhdd_total web.statistics.1.content.9.graph.2=usbhdd_used web.statistics.1.content.9.ds_graph_options.usbhdd_total.label=USB HDD total space (MB) web.statistics.1.content.9.ds_graph_options.usbhdd_total.color="#FF7777" web.statistics.1.content.9.ds_graph_options.usbhdd_used.label=USB HDD used space (MB) web.statistics.1.content.9.ds_graph_options.usbhdd_used.lines={ fill: true } web.statistics.1.content.9.ds_graph_options.usbhdd_used.color="#7777FF" _EOF_ fi fi #NETDATA INSTALLING_INDEX=65 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - service cp /DietPi/dietpi/conf/netdata.service /etc/systemd/system/netdata.service systemctl daemon-reload # - Create netdata user/group getent group netdata > /dev/null || groupadd -r netdata getent passwd netdata > /dev/null || useradd -r -g netdata -c netdata -s /sbin/nologin -d / netdata for x in /var/cache/netdata /usr/share/netdata/web /etc/netdata /var/log/netdata /var/lib/netdata; do chown -R netdata.netdata $x chmod 0775 -R $x done fi #BAIKAL INSTALLING_INDEX=57 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration Install_Apply_Permissions &> /dev/null # - install/run composer | Also run for ampache. Move this to a global function.... php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php php composer-setup.php php -r "unlink('composer-setup.php');" mv composer.phar /usr/local/bin/composer cd /var/www/baikal composer install --no-interaction cd ~/ # - Mysql DB /DietPi/dietpi/func/create_mysql_db baikal baikal "$GLOBAL_PW" fi #MUMBLESERVER INSTALLING_INDEX=43 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Cap total connections local max_users=$(( $G_HW_CPU_CORES * 8 )) sed -i "/users=/c\users=$max_users" /etc/mumble-server.ini #Name the root channel sed -i '/registerName=/c\registerName=DietPi Mumble Server' /etc/mumble-server.ini #Disable DB logging sed -i '/logdays=/c\logdays=-1' /etc/mumble-server.ini #Set Superuser passwd: http://dietpi.com/phpbb/viewtopic.php?f=11&t=2024#p8084 murmurd -ini /etc/mumble-server.ini -supw "$GLOBAL_PW" fi #EMBYSERVER INSTALLING_INDEX=41 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration Download_Test_Media fi #PLEXMEDIASERVER INSTALLING_INDEX=42 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration Download_Test_Media #For all ARM devices: # - en_US.UTF8 must be installed and the default locale on system. This is for SBC installs using dev2day repo: https://github.com/Fourdee/DietPi/issues/116#issuecomment-222195911 if (( $G_USER_INPUTS && $G_HW_ARCH < 10 && ! $(locale | grep -ci -m1 'en_US.UTF-8') )); then sed -i '/en_US.UTF-8 UTF-8/c\en_US.UTF-8 UTF-8' /etc/locale.gen locale-gen WHIP_QUESTION='Plex Media Server requires en_US.UTF8 locale to be installed and set to default, else, Plex will not start.\n\nOn the next screen:\n - Press enter (Do not make any changes to the selections, we have already selected en_US.UTF8 for you).\n\nOn the screen after:\n - Select en_US.UTF8 and press enter.' whiptail --title "Plex en_US.UTF8" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 16 70 dpkg-reconfigure locales fi fi #CUBERITE INSTALLING_INDEX=52 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/cuberite.service [Unit] Description=Cuberite Server [Service] Type=oneshot WorkingDirectory=/etc/cubrite ExecStart=/etc/cubrite/Cuberite --service ExecStop=/usr/bin/killall -w Cuberite RemainAfterExit=yes User=root [Install] WantedBy=multi-user.target _EOF_ systemctl enable cuberite.service systemctl daemon-reload #WebUI settings cat << _EOF_ > /etc/cubrite/webadmin.ini [User:root] Password=$GLOBAL_PW [WebAdmin] Ports=1339 Enabled=1 _EOF_ fi #MINEOS INSTALLING_INDEX=53 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #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 killall -w supervisord &> /dev/null killall -w node &> /dev/null killall -w nodejs &> /dev/null ln -sf "$G_FP_DIETPI_USERDATA"/mineos/minecraft/mineos_console.js /usr/local/bin/mineos cp "$G_FP_DIETPI_USERDATA"/mineos/minecraft/mineos.conf /etc/mineos.conf # - setup SSL cert cd "$G_FP_DIETPI_USERDATA"/mineos/minecraft ./generate-sslcert.sh # - Supervisor service cp "$G_FP_DIETPI_USERDATA"/mineos/minecraft/init/supervisor_conf /etc/supervisor/conf.d/mineos.conf cd "$HOME" # - Add underprivilged user for web access useradd mineos echo -e "dietpi\ndietpi\n" | passwd mineos # - Move server data storage to userdata dir (High disk writes) mkdir -p "$G_FP_DIETPI_USERDATA"/mineos/serverdata mkdir -p /var/games #sometimes this is not created by mineos after installation... Ensures symlink creation does not fail. cp -R /var/games/minecraft/* "$G_FP_DIETPI_USERDATA"/mineos/serverdata/ #Folder does not exist during installation, as of 18/09/16 rm -R /var/games/minecraft ln -sf "$G_FP_DIETPI_USERDATA"/mineos/serverdata /var/games/minecraft chown -R mineos:mineos /var/games/minecraft # - correct the node filepath for supervisor mineos sed -i '/^command=/c\command=/usr/local/bin/node webui.js' /etc/supervisor/conf.d/mineos.conf # - Set directory to G_FP_DIETPI_USERDATA sed -i "/^directory=/c\directory=$G_FP_DIETPI_USERDATA/mineos/minecraft" /etc/supervisor/conf.d/mineos.conf supervisorctl reload fi #GOGS INSTALLING_INDEX=49 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Data storage / user data mkdir -p "$G_FP_DIETPI_USERDATA"/gogs-repo # - sqldb /DietPi/dietpi/func/create_mysql_db gogs gogs "$GLOBAL_PW" # - service (couldnt get this to run as a new thread with systemD (&). so bash script ftw. cat << _EOF_ > /etc/gogs/start.sh #!/bin/bash #Simple script to start gogs for DietPi systems /etc/gogs/gogs web &> /var/log/gogs_daemon.log & exit _EOF_ chmod +x /etc/gogs/start.sh cat << _EOF_ > /etc/systemd/system/gogs.service [Unit] Description=DietPi Gogs service DefaultDependencies=no [Service] Type=oneshot RemainAfterExit=yes User=root ExecStart=/bin/bash /etc/gogs/start.sh ExecStop=/usr/bin/killall -w gogs StandardOutput=tty [Install] WantedBy=multi-user.target _EOF_ fi #QBITTORRENT INSTALLING_INDEX=46 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - conf. mkdir -p "$HOME"/.config/qBittorrent cat << _EOF_ > "$HOME"/.config/qBittorrent/qBittorrent.conf [General] ported_to_new_savepath_system=true [Preferences] Downloads\DiskWriteCacheSize=$(Optimize_BitTorrent 0) Downloads\DiskWriteCacheTTL=60 Queueing\MaxActiveDownloads=$(Optimize_BitTorrent 1) Queueing\MaxActiveTorrents=$(Optimize_BitTorrent 1) Queueing\MaxActiveUploads=1 Queueing\IgnoreSlowTorrents=false Bittorrent\MaxConnecs=$(Optimize_BitTorrent 2) Bittorrent\MaxConnecsPerTorrent=$(Optimize_BitTorrent 2) Bittorrent\MaxUploads=$(Optimize_BitTorrent 3) Bittorrent\MaxUploadsPerTorrent=$(Optimize_BitTorrent 3) WebUI\Port=1340 WebUI\Enabled=true General\Locale=en_GB Downloads\SavePath=$G_FP_DIETPI_USERDATA/downloads Downloads\TempPathEnabled=false Downloads\TempPath=$G_FP_DIETPI_USERDATA/downloads Downloads\ScanDirs=@Invalid() Downloads\DownloadInScanDirs=@Invalid() Downloads\TorrentExportDir= MailNotification\enabled=false MailNotification\email= MailNotification\smtp_server=smtp.changeme.com MailNotification\req_ssl=false MailNotification\req_auth=false MailNotification\username= MailNotification\password= Downloads\PreAllocation=false Queueing\QueueingEnabled=false Downloads\UseIncompleteExtension=false Connection\PortRangeMin=6881 Connection\UPnP=true Connection\GlobalDLLimit=-1 Connection\GlobalUPLimit=-1 Bittorrent\uTP=true Bittorrent\uTP_rate_limited=false Advanced\IncludeOverhead=false Connection\GlobalDLLimitAlt=10 Connection\GlobalUPLimitAlt=10 Scheduler\Enabled=false Bittorrent\DHT=true Bittorrent\sameDHTPortAsBT=true Bittorrent\DHTPort=6881 Bittorrent\PeX=true Bittorrent\LSD=true Bittorrent\Encryption=1 Advanced\AnonymousMode=false Connection\ProxyType=-1 Connection\Proxy\IP=0.0.0.0 Connection\Proxy\Port=8080 Connection\ProxyPeerConnections=false Connection\Proxy\Authentication=false Connection\Proxy\Username= Connection\Proxy\Password= IPFilter\Enabled=false IPFilter\File= WebUI\Username=root WebUI\LocalHostAuth=true WebUI\HTTPS\Enabled=false DynDNS\Enabled=false DynDNS\Service=0 DynDNS\Username= DynDNS\Password= DynDNS\DomainName=changeme.dyndns.org WebUI\Password_ha1=@ByteArray($(echo -ne "$GLOBAL_PW" | md5sum | awk '{print $1}')) [LegalNotice] Accepted=true [AutoRun] enabled=false program= _EOF_ # - service cat << _EOF_ > /etc/systemd/system/qbittorrent.service [Unit] Description=qBittorrent Daemon Service After=network.target [Service] Type=oneshot User=root RemainAfterExit=yes ExecStart=/usr/bin/qbittorrent-nox -d --webui-port=1340 ExecStop=/usr/bin/killall -w qbittorrent-nox [Install] WantedBy=multi-user.target _EOF_ systemctl daemon-reload fi #RTORRENT INSTALLING_INDEX=107 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Create username/password for rutorrent based on webserver type. # - Apache2 if (( ${aSOFTWARE_INSTALL_STATE[83]} >= 1 )); then # - Allow overrides redirects and .htaccess sed -i "/AllowOverride /c\ AllowOverride All" /etc/apache2/sites-enabled/000-default* sed -i "/AllowOverride /c\ AllowOverride All" /etc/apache2/apache2.conf a2enmod rewrite #install scgi module G_AGI libapache2-mod-scgi htpasswd -cb /etc/.rutorrent-htaccess root "$GLOBAL_PW" cat << _EOF_ > /var/www/rutorrent/.htaccess AuthUserFile /etc/.rutorrent-htaccess AuthName "ruTorrent_login" AuthType Basic require user root _EOF_ cat << _EOF_ > /etc/apache2/sites-available/rutorrent.conf SCGIMount /RPC2 127.0.0.1:5000 AuthName "rTorrent secure access" AuthType Basic AuthBasicProvider file AuthUserFile /etc/.rutorrent-htaccess Require user root _EOF_ ln -s /etc/apache2/sites-available/rutorrent.conf /etc/apache2/sites-enabled/rutorrent.conf # - Lighttpd elif (( ${aSOFTWARE_INSTALL_STATE[84]} >= 1 )); then echo -e "root:rtorrent:$(echo -n "root:rtorrent:dietpi" | md5sum | cut -b -32)" > /etc/.rutorrent-htaccess # - add to /etc/lighttpd/lighttpd.conf if (( ! $(cat /etc/lighttpd/lighttpd.conf | grep -ci -m1 '^#RUTORRENT_DIETPI') )); then cat << _EOF_ >> /etc/lighttpd/lighttpd.conf #RUTORRENT_DIETPI server.modules += ( "mod_fastcgi" ) server.modules += ( "mod_scgi" ) server.modules += ( "mod_auth" ) auth.debug = 0 auth.backend = "htdigest" auth.backend.htdigest.userfile = "/etc/.rutorrent-htaccess" auth.require = ( "/rutorrent/" => ( "method" => "digest", "realm" => "rtorrent", "require" => "valid-user" )) scgi.server = ( "/RPC2" => ( "127.0.0.1" => ( "host" => "127.0.0.1", "port" => 5000, "check-local" => "disable" ) ) ) #RUTORRENT_DIETPI _EOF_ fi # - Nginx elif (( ${aSOFTWARE_INSTALL_STATE[85]} >= 1 )); then echo "root:$(openssl passwd -crypt dietpi)" > /etc/.rutorrent-htaccess cat << _EOF_ > /etc/nginx/sites-dietpi/rutorrent.config location /rutorrent { auth_basic "Restricted Content"; auth_basic_user_file /etc/.rutorrent-htaccess; } location /RPC2 { include scgi_params; scgi_pass 127.0.0.1:5000; } _EOF_ fi # - Define curl location in config.php (for lighttpd and nginx) sed -i '/"curl"[[:space:]]/c\ "curl" => "/usr/bin/curl",' /var/www/rutorrent/conf/config.php chown www-data:www-data /etc/.rutorrent-htaccess chmod 400 /etc/.rutorrent-htaccess # - Session folder mkdir -p "$G_FP_DIETPI_USERDATA"/downloads/.session # - Service using screen | '/usr/bin/rtorrent &> /var/log/rtorrent.log &' doesnt work, hangs program after 5 seconds cat << _EOF_ > /etc/systemd/system/rtorrent.service [Unit] Description=rTorrent After=network.target [Service] User=root Type=forking KillMode=none ExecStart=/usr/bin/screen -d -m -fa -S rtorrent /usr/bin/rtorrent ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent WorkingDirectory=%h [Install] WantedBy=multi-user.target _EOF_ systemctl daemon-reload #Default conf cat << _EOF_ > "$HOME"/.rtorrent.rc #Attempt to reduce disk throttling/abuse | 0.9.2 command does not exist #max_open_files = 50 #Max queue scheduler.max_active.set = 3 #byte value max_memory_usage = $(( $(Optimize_BitTorrent 0) * 1024 * 1024 )) # Maximum and minimum number of peers to connect to per torrent. min_peers = 1 max_peers = $(( $(Optimize_BitTorrent 2) / 2 + 1 )) # Same as above but for seeding completed torrents (-1 = same as downloading) min_peers_seed = -1 max_peers_seed = -1 # Maximum number of simultaneous downloads max_downloads_global = $(Optimize_BitTorrent 2) # Maximum number of simultaneous uploads max_uploads_global = $(Optimize_BitTorrent 3) # Global upload and download rate in KiB. "0" for unlimited. download_rate = 0 upload_rate = 0 # Default directory to save the downloaded torrents. directory = $G_FP_DIETPI_USERDATA/downloads # Default session directory. Make sure you don't run multiple instance # of rtorrent using the same session directory. Perhaps using a # relative path? session = $G_FP_DIETPI_USERDATA/downloads/.session # Close torrents when diskspace is low. schedule = low_diskspace,5,60,close_low_diskspace=1000M # Periodically save session data schedule = session_save,240,300,session_save= # Enable the default ratio group. ratio.enable=yes # Change the limits, the defaults should be sufficient. # Upload to a minimum ratio of 1.01 ratio.min.set=101 # Upload to a maximum ratio of 1.25 ratio.max.set=125 # Upload a minimum of x MB ratio.upload.set=1M # When seeding ratio is reached close the torrent system.method.set = group.seeding.ratio.command, d.close= # Move files to ./unsorted when download completes system.method.set_key = event.download.finished,move_complete,"execute=mv,-n,$d.get_base_path=,./unsorted/;d.set_directory=./unsorted/" # Port range to use for listening. port_range = 33101-33199 # Start opening ports at a random position within the port range. port_random = yes # Encryption options, set to none (default) or any combination of the following: # allow_incoming, try_outgoing, require, require_RC4, enable_retry, prefer_plaintext # # The example value allows incoming encrypted connections, starts unencrypted # outgoing connections but retries with encryption if they fail, preferring # plaintext to RC4 encryption after the encrypted handshake # encryption = require # Sort the main view by ratio view.sort_current = main,greater=d.get_ratio= view.sort_new = main,less=d.get_ratio= view.sort = main # Sort the seeding view by the upload rate and only show torrents with peers view.sort_current = seeding,greater=d.get_up_rate= view.filter = seeding,"and=d.get_complete=,d.get_peers_connected=" view.sort_new = seeding,less=d.get_up_rate= view.sort = seeding # Sort the leeching view by name view.sort_current = leeching,greater=d.get_name= view.sort_new = leeching,greater=d.get_name= view.sort = leeching # Filter the active view by connected peers view.sort_current = active,less=d.get_name= view.sort_new = leeching,less=d.get_name= view.filter = active,d.get_peers_connected= view.sort = active schedule = sort_main,11,5,view.sort=main schedule = sort_seeding,12,5,view.sort=seeding schedule = sort_leeching,13,5,view.sort=leeching schedule = sort_active,14,5,view.sort=active # Enable DHT support for trackerless torrents or when all trackers are down. # May be set to "disable" (completely disable DHT), "off" (do not start DHT), # "auto" (start and stop DHT as needed), or "on" (start DHT immediately). # The default is "off". For DHT to work, a session directory must be defined. # dht = auto # UDP port to use for DHT. # #dht_port = 6881 # Enable peer exchange (for torrents not marked private) # peer_exchange = yes #Enable remote access (eg: webui) scgi_port = localhost:5000 _EOF_ fi #Aria2 INSTALLING_INDEX=132 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/aria2.service [Unit] Description=DietPi Aria2 [Service] Type=simple ExecStart=$(which aria2c) --enable-rpc --rpc-listen-all --rpc-secret=$GLOBAL_PW --dir=$G_FP_DIETPI_USERDATA/$FOLDER_DOWNLOADS [Install] WantedBy=multi-user.target _EOF_ fi #SYNCTHING INSTALLING_INDEX=50 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Generate dir's mkdir -p "$G_FP_DIETPI_USERDATA"/syncthing mkdir -p "$G_FP_DIETPI_USERDATA"/syncthing_data # Logs/Binary mkdir -p /var/log/syncthing echo '' > /var/log/syncthing/syncthing.log chown -R dietpi:dietpi /var/log/syncthing chown -R dietpi:dietpi /etc/syncthing # - run syncthing to create cert/config and exit /etc/syncthing/syncthing -generate="$G_FP_DIETPI_USERDATA"/syncthing # - Disable automatic upgrades sed -i '/<\/autoUpgradeIntervalH>/c\ 0<\/autoUpgradeIntervalH>' "$G_FP_DIETPI_USERDATA"/syncthing/config.xml # - Allow external access (LAN). sed -i '/:8384<\/address>/c\
0.0.0.0:8384<\/address>' "$G_FP_DIETPI_USERDATA"/syncthing/config.xml # - Set default folder sed -i '/label=\"Default Folder/c\ ' "$G_FP_DIETPI_USERDATA"/syncthing/config.xml # - Disable browser starting sed -i '/<\/startBrowser>/c\ false<\/startBrowser>' "$G_FP_DIETPI_USERDATA"/syncthing/config.xml # - Enable filesystem watcher (previously inotify) sed -i 's/fsWatcherEnabled=\"false\"/fsWatcherEnabled=\"true\"/g' "$G_FP_DIETPI_USERDATA"/syncthing/config.xml #services cat << _EOF_ > /etc/systemd/system/syncthing.service [Unit] Description=Syncthing 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 [Install] WantedBy=multi-user.target _EOF_ # - Increase open file limit: echo -e "fs.inotify.max_user_watches=204800" | tee -a /etc/sysctl.conf fi #Urbackup server INSTALLING_INDEX=111 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration mkdir -p "$G_FP_DIETPI_USERDATA"/urbackup/urbackup_tmp_files #As we have /tmp mounted to RAM, change tmp locations sed -i '/DAEMON_TMPDIR=/c\DAEMON_TMPDIR="/var/tmp"' /etc/default/urbackupsrv #https://github.com/Fourdee/DietPi/issues/545#issuecomment-252419739 #sqlite3 /usr/local/var/urbackup/backup_server_settings.db "UPDATE settings SET value = '/mnt/dietpi_userdata/urbackup/' WHERE key = 'backupfolder'" fi #SICKRAGE INSTALLING_INDEX=116 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration mkdir -p "$G_FP_DIETPI_USERDATA"/sickrage cat << _EOF_ > /etc/systemd/system/sickrage.service [Unit] Description=SickRage After=dietpi-service.service [Service] User=root Group=root Type=forking GuessMainPID=no ExecStart=/usr/bin/python /etc/sickrage/SickBeard.py -q --daemon --nolaunch --datadir=$G_FP_DIETPI_USERDATA/sickrage #ExecStop=/usr/bin/killall -w SickBeard.py [Install] WantedBy=multi-user.target _EOF_ #Grab our premade config: # SickRage must be run at least once, or it will simply overwrite our config G_DIETPI-NOTIFY 2 "Configuring SickRage, please wait..." systemctl start sickrage # Wait for SickRage to generate its default config.ini, else, it will just overwrite our config.ini. local max_loops=10 local current_loop=0 while [ ! -f "$G_FP_DIETPI_USERDATA/sickrage/config.ini" ] do G_DIETPI-NOTIFY 2 "Waiting for SickRage to finish 1st run prep, please wait..." sleep 1 ((current_loop++)) if (( $current_loop >= $max_loops )); then G_DIETPI-NOTIFY 1 "Timed-out waiting for SickRage to generate config.ini" break fi done systemctl stop sickrage cp "$G_FP_DIETPI_USERDATA"/sickrage/config.ini "$G_FP_DIETPI_USERDATA"/sickrage/config.ini.default wget http://dietpi.com/downloads/conf/sickrage_dietpi_config.ini -O "$G_FP_DIETPI_USERDATA"/sickrage/config.ini fi #TONIDO INSTALLING_INDEX=134 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #service cat << _EOF_ > /etc/systemd/system/tonido.service [Unit] Description=Tonido - DietPi [Service] Type=simple User=root WorkingDirectory=/etc/tonido ExecStart=/bin/bash -c 'export LD_LIBRARY_PATH=/etc/tonido; export TONIDODIR=/etc/tonido; ./tonidoconsole' [Install] WantedBy=multi-user.target _EOF_ # - userdirs mkdir -p "$G_FP_DIETPI_USERDATA"/tonido/sync mkdir -p "$G_FP_DIETPI_USERDATA"/tonido/syncdata # symlink cp -R "$HOME"/tonido "$G_FP_DIETPI_USERDATA"/ &> /dev/null rm -R "$HOME"/tonido &> /dev/null ln -sf "$G_FP_DIETPI_USERDATA"/tonido "$HOME"/tonido ln -sf "$G_FP_DIETPI_USERDATA"/tonido/sync "$HOME"/TonidoSync ln -sf "$G_FP_DIETPI_USERDATA"/tonido/syncdata "$HOME"/TonidoSyncData # - armv7 switch if (( $G_HW_ARCH == 2 )); then sed -i 's/armv6l/armv7l/' /etc/tonido/manifest.xml sed -i 's/armv6l/armv7l/' /etc/tonido/plugins/*/manifest.xml fi fi #Chromium INSTALLING_INDEX=113 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Allow root, start maximized and disable sandbox under root (blank screen without) local export_options="export CHROMIUM_FLAGS=\"\$CHROMIUM_FLAGS --no-sandbox --temp-profile --start-maximized --user-data-dir " #RPi if (( $G_HW_MODEL < 10 )); then # OpenGL if (( $G_HW_MODEL >= 2 )); then #Hangs xinit: https://github.com/Fourdee/DietPi/issues/834 #/DietPi/dietpi/func/dietpi-set_hardware rpi-opengl enable echo 0 fi #OpenGL elif (( $G_HW_MODEL == 21 )); then echo 0 &> /dev/null #GLES else export_options+='--use-gl=egl' fi export_options+="\"" mkdir -p /etc/chromium.d cat << _EOF_ > /etc/chromium.d/custom_flags $export_options _EOF_ # Chromium 60+ cp /etc/chromium.d/custom_flags "$HOME"/.chromium-browser.init #Symlink to desktop # * for RPi Stretch due to chromium-browser.desktop ln -sf /usr/share/applications/chromium*.desktop "$HOME"/Desktop/chromium.desktop fi #OMV INSTALLING_INDEX=126 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration omv-initsystem fi #O!MPD INSTALLING_INDEX=129 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration sed -i "/'mysqli_user'/c \$cfg[\'mysqli_user\'] = \'ompd\';" /var/www/ompd/include/config.inc.php sed -i "/'mysqli_password'/c \$cfg[\'mysqli_password\'] = \'$GLOBAL_PW\';" /var/www/ompd/include/config.inc.php sed -i "/'media_dir'/c \$cfg[\'media_dir\'] = \'/var/lib/mpd/music/\';" /var/www/ompd/include/config.inc.php sed -i "/'ignore_media_dir_access_error'/c \$cfg[\'ignore_media_dir_access_error\'] = \'true';" /var/www/ompd/include/config.inc.php /DietPi/dietpi/func/create_mysql_db ompd ompd "$GLOBAL_PW" fi #IceCast + DarkIce INSTALLING_INDEX=135 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #icecast set passwords: sed -i '/\/c\\dietpi\<\/source-password\>' /etc/icecast2/icecast.xml sed -i '/\/c\\dietpi\<\/relay-password\>' /etc/icecast2/icecast.xml # Create random password local admin_password=$(tr -cd '[:alnum:]' < /dev/urandom | fold -w10 | head -n1) sed -i "/\/c\\$admin_password\<\/admin-password\>" /etc/icecast2/icecast.xml sed -i '/ENABLE=/c\ENABLE=true' /etc/default/icecast2 #Configure for ALSA loopback? # echo -e "options snd_aloop pcm_substreams=2 #index=10# breaks module loading..." > /etc/modprobe.d/snd_aloop_index.conf # modprobe snd-aloop # if (( ! $(cat /etc/modules | grep -ci -m1 '^snd-aloop') )); then # echo -e "snd-aloop" >> /etc/modules # fi #Darkice local input_device_index=$(arecord -l | grep -m1 'card' | awk '{print $2}' | sed 's/://') cat << _EOF_ > /etc/darkice.cfg [general] duration = 0 bufferSecs = 3 reconnect = yes [input] device = hw:$input_device_index,0 sampleRate = 44100 bitsPerSample = 16 channel = 1 [icecast2-0] bitrateMode = vbr format = vorbis quality = 0.8 server = dietpi port = 8000 password = dietpi mountPoint = DietPi name = DietPi description = DarkIce on DietPi url = http://localhost genre = none public = no #localDumpFile = $G_FP_DIETPI_USERDATA/darkice_recording.ogg _EOF_ #SystemD service for Darkice rm /etc/init.d/darkice cat << _EOF_ > /etc/systemd/system/darkice.service [Unit] Description=DarkIce - DietPi After=icecast2.service Requires=icecast2.service [Service] Type=simple ExecStart=$(which darkice) [Install] WantedBy=multi-user.target _EOF_ fi #Blynk INSTALLING_INDEX=131 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - service local fp_java_binary=$(which java) mkdir -p "$G_FP_DIETPI_USERDATA"/blynk CONFIG_FILE_URL_ADDRESS='https://raw.githubusercontent.com/blynkkk/blynk-server/master/server/core/src/main/resources/server.properties' wget "$CONFIG_FILE_URL_ADDRESS" -O "$G_FP_DIETPI_USERDATA"/blynk/server.properties sed -i "/data.folder=/c\data.folder=$G_FP_DIETPI_USERDATA/blynk" "$G_FP_DIETPI_USERDATA"/blynk/server.properties cat << _EOF_ > /etc/systemd/system/blynkserver.service [Unit] Description=Blynk Server After=network.target [Service] Type=simple ExecStart=$fp_java_binary -jar /etc/blynkserver/server.jar -serverConfig $G_FP_DIETPI_USERDATA/blynk/server.properties [Install] WantedBy=multi-user.target _EOF_ fi #MotionEye INSTALLING_INDEX=136 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Enable RPi cam if (( $G_HW_MODEL < 10 )); then /DietPi/dietpi/func/dietpi-set_hardware rpi-camera enable fi mkdir -p /etc/motioneye cp /usr/local/share/motioneye/extra/motioneye.conf.sample /etc/motioneye/motioneye.conf mkdir -p "$G_FP_DIETPI_USERDATA"/motioneye sed -i "/^media_path/c\media_path $G_FP_DIETPI_USERDATA/motioneye" /etc/motioneye/motioneye.conf # service cp /usr/local/share/motioneye/extra/motioneye.systemd-unit-local /etc/systemd/system/motioneye.service fi #CloudPrint INSTALLING_INDEX=137 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Enable web admin cupsctl --remote-admin usermod -a -G lpadmin root fi #VirtualHere INSTALLING_INDEX=138 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/virtualhere.service [Unit] Description=VirtualHere DietPi service 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 fi #SABnzbd INSTALLING_INDEX=139 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/sabnzbd.service [Unit] Description=sabnzbd DietPi [Service] Type=simple ExecStart=/usr/bin/python /etc/sabnzbd/SABnzbd.py -f /etc/sabnzbd/sabnzbd.ini [Install] WantedBy=multi-user.target _EOF_ systemctl daemon-reload #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 systemctl start sabnzbd G_DIETPI-NOTIFY 2 "Generating initial config, please wait..." while [ ! -f /etc/sabnzbd/sabnzbd.ini ] do sleep 1 done sleep 2 systemctl stop sabnzbd sleep 2 #additional wait, config being overwritten after below changes: http://dietpi.com/phpbb/viewtopic.php?f=11&t=1848&p=7085#p7082 sed -i "/^download_dir =/c\download_dir = $G_FP_DIETPI_USERDATA/downloads/incomplete" /etc/sabnzbd/sabnzbd.ini sed -i "/^complete_dir =/c\complete_dir = $G_FP_DIETPI_USERDATA/downloads/complete" /etc/sabnzbd/sabnzbd.ini sed -i "/^nzb_backup_dir =/c\nzb_backup_dir = $G_FP_DIETPI_USERDATA/downloads/sabnzbd_nzb_backup" /etc/sabnzbd/sabnzbd.ini sed -i "/^admin_dir =/c\admin_dir = $G_FP_DIETPI_USERDATA/downloads/sabnzbd_admin" /etc/sabnzbd/sabnzbd.ini sed -i "/^log_dir =/c\log_dir = /var/log" /etc/sabnzbd/sabnzbd.ini sed -i "/^log_level =/c\log_level = 0" /etc/sabnzbd/sabnzbd.ini #err only sed -i "/^refresh_rate =/c\refresh_rate = 2" /etc/sabnzbd/sabnzbd.ini sed -i "/^host =/c\host = 0.0.0.0" /etc/sabnzbd/sabnzbd.ini fi #spotifyconnectweb INSTALLING_INDEX=141 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/spotify-connect-web.service [Unit] Description=spotify-connect-web 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 [Install] WantedBy=multi-user.target _EOF_ fi #couchpotato INSTALLING_INDEX=142 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cp /etc/couchpotato/init/ubuntu.default /etc/default/couchpotato sed -i "/CP_USER=/c\CP_USER=root" /etc/default/couchpotato sed -i "/CP_HOME=/c\CP_HOME=/etc/couchpotato" /etc/default/couchpotato sed -i "/CP_DATA=/c\CP_DATA=$G_FP_DIETPI_USERDATA/couchpotato" /etc/default/couchpotato mkdir -p "$G_FP_DIETPI_USERDATA"/couchpotato #useradd -d "$G_FP_DIETPI_USERDATA"/couchpotato couchpotato cp /etc/couchpotato/init/ubuntu /etc/init.d/couchpotato fi #Koel INSTALLING_INDEX=143 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration Download_Test_Media /DietPi/dietpi/func/create_mysql_db koel koel "$GLOBAL_PW" cd /var/www/koel sed -i '/DB_CONNECTION=/c\DB_CONNECTION=mysql' .env sed -i '/DB_HOST=/c\DB_HOST=127.0.0.1' .env sed -i '/DB_DATABASE=/c\DB_DATABASE=koel' .env sed -i '/DB_USERNAME=/c\DB_USERNAME=koel' .env sed -i "/DB_PASSWORD=/c\DB_PASSWORD=$GLOBAL_PW" .env sed -i '/ADMIN_EMAIL=/c\ADMIN_EMAIL=dietpi@dietpi.com' .env sed -i '/ADMIN_NAME=/c\ADMIN_NAME=admin' .env sed -i "/ADMIN_PASSWORD=/c\ADMIN_PASSWORD=$GLOBAL_PW" .env sed -i "/FFMPEG_PATH=/c\FFMPEG_PATH=$(which ffmpeg)" .env php artisan koel:init #php artisan db:seed --force cd "$HOME" cat << _EOF_ > /etc/systemd/system/koel.service [Unit] Description=Koel [Service] Type=simple User=root WorkingDirectory=/var/www/koel ExecStart=$(which php) /var/www/koel/artisan serve --host 0.0.0.0 [Install] WantedBy=multi-user.target _EOF_ fi #Sonarr INSTALLING_INDEX=144 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/sonarr.service [Unit] Description=Sonarr (NzbDrone) Daemon After=network.target [Service] User=root Restart=on-failure RestartSec=5 Type=simple ExecStart=/usr/bin/mono --debug /opt/NzbDrone/NzbDrone.exe -nobrowser TimeoutStopSec=20 [Install] WantedBy=multi-user.target _EOF_ fi #Radarr INSTALLING_INDEX=145 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/radarr.service [Unit] Description=Radarr Daemon After=network.target [Service] User=root Restart=on-failure RestartSec=5 Type=simple ExecStart=/usr/bin/mono --debug /opt/Radarr/Radarr.exe -nobrowser TimeoutStopSec=20 [Install] WantedBy=multi-user.target _EOF_ fi #PlexPy INSTALLING_INDEX=146 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration mkdir -p "$G_FP_DIETPI_USERDATA"/plexpy cat << _EOF_ > /etc/systemd/system/plexpy.service [Unit] Description=PlexPy - Stats for Plex Media Server usage [Service] ExecStart=/opt/plexpy/PlexPy.py --quiet --daemon --nolaunch --config /opt/plexpy/config.ini --datadir $G_FP_DIETPI_USERDATA/plexpy GuessMainPID=no Type=forking User=root Group=root [Install] WantedBy=multi-user.target _EOF_ fi #Jackett INSTALLING_INDEX=147 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/jackett.service [Unit] Description=Jackett Daemon After=network.target [Service] User=root Restart=always RestartSec=5 Type=simple ExecStart=/usr/bin/mono --debug /opt/jackett/JackettConsole.exe TimeoutStopSec=20 [Install] WantedBy=multi-user.target _EOF_ fi #NZBget INSTALLING_INDEX=149 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration sed -i "/MainDir=/c\MainDir=$G_FP_DIETPI_USERDATA/downloads" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/DestDir=/c\DestDir=$G_FP_DIETPI_USERDATA/downloads/complete" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/LogFile=/c\LogFile=/var/log/nzbget.log" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/ControlUsername=/c\ControlUsername=root" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/ControlPassword=/c\ControlPassword=$GLOBAL_PW" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf # Optimizations sed -i "/Server1.Cipher=/c\Server1.Cipher=RC4-MD5" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/CrcCheck=/c\CrcCheck=no" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/ParScan=/c\ParScan=limited" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/ParThreads=/c\ParThreads=$G_HW_CPU_CORES" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/DebugTarget=/c\DebugTarget=none" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/CrashTrace=/c\CrashTrace=no" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/DetailTarget=/c\DetailTarget=none" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/ParBuffer=/c\ParBuffer=$(Optimize_BitTorrent 0)" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/ArticleCache=/c\ArticleCache=$(Optimize_BitTorrent 0)" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf sed -i "/WriteBuffer=/c\WriteBuffer=$(Optimize_BitTorrent 0)" "$G_FP_DIETPI_USERDATA"/nzbget/nzbget.conf cat << _EOF_ > /etc/systemd/system/nzbget.service [Unit] Description=NZBget [Service] Type=forking User=root WorkingDirectory=$G_FP_DIETPI_USERDATA/nzbget ExecStart=$G_FP_DIETPI_USERDATA/nzbget/nzbget -D [Install] WantedBy=multi-user.target _EOF_ fi #HTPC Manager INSTALLING_INDEX=155 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/htpc-manager.service [Unit] Description=HTPC Manager After=network.target [Service] Type=simple ExecStart=/usr/bin/python $G_FP_DIETPI_USERDATA/htpc-manager/Htpc.py [Install] WantedBy=multi-user.target _EOF_ fi #OctoPrint INSTALLING_INDEX=153 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/octoprint.service [Unit] Description=OctoPrint [Service] Type=simple User=root ExecStart=$(which octoprint) serve --iknowwhatimdoing [Install] WantedBy=multi-user.target _EOF_ fi #RoonServer INSTALLING_INDEX=154 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/roonserver.service [Unit] Description=Roon Server After=network.target [Service] Type=simple User=root Environment=ROON_DATAROOT=$G_FP_DIETPI_USERDATA/roonserver ExecStart=$G_FP_DIETPI_USERDATA/roonserver/start.sh [Install] WantedBy=multi-user.target _EOF_ fi #Steam INSTALLING_INDEX=156 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration mkdir -p "$G_FP_DIETPI_USERDATA"/steam mv "$HOME"/.steam/* "$G_FP_DIETPI_USERDATA"/steam/ rm -R "$HOME"/.steam ln -sf "$G_FP_DIETPI_USERDATA"/steam "$HOME"/.steam fi #------------------ Home Automation: Home Assistant ------------------ INSTALLING_INDEX=157 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cat << _EOF_ > /etc/systemd/system/home-assistant.service [Unit] Description=Home Assistant After=network.target [Service] Type=simple User=homeassistant ExecStart=/srv/homeassistant/homeassistant-start.sh [Install] WantedBy=multi-user.target _EOF_ # Link to the default ha location for the homeassistant user, this makes # the configuration avaliable for the user to edit. Configuration generated # when service is started at /home/homeassistant/.homeassistant mkdir "$G_FP_DIETPI_USERDATA"/homeassistant ln -sf "$G_FP_DIETPI_USERDATA"/homeassistant /home/homeassistant/.homeassistant fi #------------------------------------------------------------------- #Minio Config INSTALLING_INDEX=158 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # Create simple mandatory default configuration file cat << _EOF_ >> /etc/default/minio # Default file path MINIO_VOLUMES="$G_FP_DIETPI_USERDATA/minio-data" # Use if you want to run Minio on a custom port. # MINIO_OPTS="--address :9199" # Access Key of the server. # MINIO_ACCESS_KEY=Server-Access-Key # Secret key of the server. # MINIO_SECRET_KEY=Server-Secret-Key _EOF_ # Enable startup on boot by default systemctl enable minio.service fi #Docker Config INSTALLING_INDEX=162 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # Create directory for docker containers mkdir "$G_FP_DIETPI_USERDATA"/docker-data # stop service systemctl stop docker.service # Set container(s) locations in /lib/systemd/system/docker.service sed -i "/ExecStart=\/usr\/bin\/dockerd/c\ExecStart=\/usr\/bin\/dockerd -g $G_FP_DIETPI_USERDATA\/docker-data -H fd:\/\/" /lib/systemd/system/docker.service fi #------------------------------------------------------------------- #FuguHub Config INSTALLING_INDEX=161 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # Setup Filestore DietPi appropriate # IF already present just create symlink if [ ! -f "$G_FP_DIETPI_USERDATA"/fuguhub-data/ ]; then # Move installed filestore to dietpi folder mkdir "$G_FP_DIETPI_USERDATA"/fuguhub-data/ mv /home/bd/disk/* "$G_FP_DIETPI_USERDATA"/fuguhub-data/ # Removed 'actual' folder to make way for symlink rm -r /home/bd/disk # Create symlink ln -s "$G_FP_DIETPI_USERDATA"/fuguhub-data /home/bd/disk # Set permissions # setfacl -R -m u:bd:rwx "$G_FP_DIETPI_USERDATA"/fuguhub-data/ else # Removed 'actual' folder to make way for symlink rm -r /home/bd/disk # Create symlink ln -s "$G_FP_DIETPI_USERDATA"/fuguhub-data /home/bd/disk fi fi #------------------------------------------------------------------- #Nukkit Config INSTALLING_INDEX=164 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # Conig file to autostart -- english default wget -O /usr/local/bin/nukkit/nukkit.yml https://github.com/Nukkit/Languages/raw/master/eng/nukkit.yml # create systemd file cat << _EOF_ > /etc/systemd/system/nukkit.service [Unit] Description=nukkit [Service] WorkingDirectory=/usr/local/bin/nukkit ExecStart=/bin/bash -c 'java -jar /usr/local/bin/nukkit/nukkit.jar' [Install] WantedBy=multi-user.target _EOF_ fi #GITEA Config INSTALLING_INDEX=165 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - service cat << _EOF_ > /etc/systemd/system/gitea.service [Unit] Description=Gitea (Git with a cup of tea) [Service] Type=simple User=dietpi WorkingDirectory=$G_FP_DIETPI_USERDATA/gitea/gitea-repositories ExecStart=$G_FP_DIETPI_USERDATA/gitea/gitea web Environment=USER=dietpi HOME=$G_FP_DIETPI_USERDATA/gitea [Install] WantedBy=multi-user.target _EOF_ # - Logs mkdir -p /var/log/gitea chown -R dietpi:dietpi /var/log/gitea # - sqldb /DietPi/dietpi/func/create_mysql_db gitea gitea "$GLOBAL_PW" fi #Allo Config INSTALLING_INDEX=159 #160 for quick reinstall/update if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 || ${aSOFTWARE_INSTALL_STATE[160]} == 1 )); then Banner_Configuration /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 # - Redirect to web interface by default: rm /var/www/index.htm* cat << _EOF_ > /var/www/index.php _EOF_ #HW specific changes # - SPARKY ONLY - Auto detect eth adapter if (( $G_HW_MODEL == 70 )); then # - Disable onboard ETH if adapter found cat << _EOF_ > /etc/systemd/system/sparky_eth_controller.service [Unit] Description=Sparky auto detect and set onboard ETH/USB ETH After=network.target networking.service [Service] Type=simple RemainAfterExit=yes ExecStart=/bin/bash -c '/usr/local/bin/sparky_eth_controller.sh' [Install] WantedBy=multi-user.target _EOF_ systemctl daemon-reload systemctl enable sparky_eth_controller.service cat << _EOF_ > /usr/local/bin/sparky_eth_controller.sh #!/bin/bash #We need to wait until USB eth is established on USB bus. This takes much longer than onboard init and network.target network-pre.target sleep 20 # - Set USB ETH if found if (( \$(ifconfig -a | grep -ci -m1 '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 reboot # - Enable onboard ETH if no adapter found elif (( ! \$(ifconfig -a | grep -ci -m1 '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 reboot fi _EOF_ chmod +x /usr/local/bin/sparky_eth_controller.sh fi # - Allow for quick updates with 160 reinstall aSOFTWARE_INSTALL_STATE[160]=2 fi #Gmediarender INSTALLING_INDEX=163 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration cp /DietPi/dietpi/conf/gmrender.service /etc/systemd/system/gmrender.service fi #AudioPhonics Pi-SPC INSTALLING_INDEX=166 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration mkdir -p /var/lib/dietpi/dietpi-software/installed/pi-spc cat << _EOF_ > /var/lib/dietpi/dietpi-software/installed/pi-spc/sds.sh #!/bin/bash #DietPi version PATH=/usr/bin:/home/pi/wiringPi/gpio:/usr/local/bin 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" gpio -g mode 04 out gpio -g write 04 0 gpio -g mode 17 in gpio -g write 17 0 gpio -g mode 22 out gpio -g write 22 1 while true do if (( \$(gpio -g read 17) == 1 )); then G_DIETPI-NOTIFY 0 "AudioPhonics Pi-SPC: Power off requested. Shutting down system." sudo poweroff #sudo shutdown -h -P now break fi sleep \$TICKRATE done exit 0 _EOF_ chmod +x /var/lib/dietpi/dietpi-software/installed/pi-spc/sds.sh cat << _EOF_ > /etc/systemd/system/pi-spc.service [Unit] Description=AudioPhonics Pi-SPC [Service] Type=simple StandardOutput=tty User=root ExecStart=/bin/bash -c '/var/lib/dietpi/dietpi-software/installed/pi-spc/sds.sh' [Install] WantedBy=multi-user.target _EOF_ fi #moOde Configuration INSTALLING_INDEX=168 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration #Create moOde runtime environment --------------------------------------------------------- # Create Pi user, does not exist on DietPi systems. # - Required for some moOde bash scripts which live in /home/pi /DietPi/dietpi/func/dietpi-set_software useradd pi # Priv #echo -e 'pi\tALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers # Completed with /DietPi/dietpi/func/dietpi-set_software useradd pi echo -e 'www-data\tALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers # Dirs mkdir -p /var/local/www/commandw mkdir -p /var/local/www/cssw mkdir -p /var/local/www/jsw mkdir -p /var/local/www/imagesw mkdir -p /var/local/www/imagesw/toggle mkdir -p /var/local/www/db mkdir -p /var/local/www/templatesw chmod -R 0755 /var/local/www mkdir -p /var/lib/mpd/music/RADIO mkdir -p /mnt/NAS mkdir -p /mnt/SDCARD mkdir -p /mnt/UPNP mkdir /media # Symlinks ln -s /mnt/NAS /var/lib/mpd/music/NAS ln -s /mnt/SDCARD /var/lib/mpd/music/SDCARD ln -s /media /var/lib/mpd/music/USB ln -s /var/lib/mpd/music /var/www/mpdmusic # Logs touch /var/log/moode.log chmod 0666 /var/log/moode.log touch /var/log/php_errors.log chmod 0666 /var/log/php_errors.log # Files cp ./rel-stretch/mpd/sticker.sql /var/lib/mpd cp -r "./rel-stretch/other/sdcard/Stereo Test/" /var/lib/mpd/music/SDCARD #cp ./rel-stretch/network/interfaces.default /etc/network/interfaces #Disabled as overwrites DietPi network conf. As DietPi does not use/set /etc/dhcpcd.conf, this will render no connection after reboot. cp ./rel-stretch/network/wpa_supplicant.conf.default /etc/wpa_supplicant/wpa_supplicant.conf cp ./rel-stretch/network/dhcpcd.conf.default /etc/dhcpcd.conf cp ./rel-stretch/network/hostapd.conf.default /etc/hostapd/hostapd.conf cp ./rel-stretch/var/local/www/db/moode-sqlite3.db.default /var/local/www/db/moode-sqlite3.db # Permissions chmod 0777 /var/lib/mpd/music/RADIO chmod -R 0777 /var/local/www/db # Deletes rm /etc/update-motd.d/10-uname #Install moOde sources and configs --------------------------------------------------------- # Application sources and configs rm /var/lib/mpd/music/RADIO/* rm /var/www/images/radio-logos/* cp ./rel-stretch/mpd/RADIO/* /var/lib/mpd/music/RADIO cp ./rel-stretch/mpd/playlists/* /var/lib/mpd/playlists cp -r ./rel-stretch/etc/* /etc/ cp -r ./rel-stretch/home/* /home/pi/ cp -r ./rel-stretch/home/.dircolors /home/pi/ cp -r ./rel-stretch/lib/* /lib/ cp -r ./rel-stretch/usr/* /usr/ cp -r ./rel-stretch/var/* /var/ cp -r ./rel-stretch/www/* /var/www/ # Prep SQL DB chmod 0755 /var/www/command/* /var/www/command/util.sh "emerald" "2ecc71" "27ae60" sqlite3 /var/local/www/db/moode-sqlite3.db "update cfg_system set value='Emerald' where param='themecolor'" # Enabled moOde features # sqlite3 /var/local/www/db/moode-sqlite3.db "update cfg_system set value='254' where param='feat_bitmask'" # // features availability bitmask settings # const FEAT_ADVKERNELS = 0b00000001; // 1 # const FEAT_AIRPLAY = 0b00000010; // 2 # const FEAT_MINIDLNA = 0b00000100; // 4 # const FEAT_MPDAS = 0b00001000; // 8 # const FEAT_SQUEEZELITE = 0b00010000; // 16 # const FEAT_UPMPDCLI = 0b00100000; // 32 # const FEAT_SQSHCHK = 0b01000000; // 64 # const FEAT_GMUSICAPI = 0b10000000; // 128 # Permissions for service files # - MPD chmod 0755 /etc/init.d/mpd chmod 0644 /lib/systemd/system/mpd.service chmod 0644 /lib/systemd/system/mpd.socket # - Bluetooth chmod 0666 /etc/bluealsaaplay.conf chmod 0644 /etc/systemd/system/bluealsa-aplay@.service chmod 0644 /etc/systemd/system/bluealsa.service chmod 0644 /lib/systemd/system/bluetooth.service chmod 0755 /usr/local/bin/a2dp-autoconnect # - Rotenc chmod 0644 /lib/systemd/system/rotenc.service # - Udev chmod 0644 /etc/udev/rules.d/* # Services are started by moOde Worker so lets disable them here. systemctl daemon-reload #systemctl disable mpd.service #dietpi-services systemctl disable mpd.socket systemctl disable rotenc.service # Following binaries will not have been installed yet, but let's disable the services here chmod 0644 /lib/systemd/system/squeezelite-armv6l.service chmod 0644 /lib/systemd/system/squeezelite-armv7l.service systemctl disable squeezelite-armv6l systemctl disable squeezelite-armv7l chmod 0644 /lib/systemd/system/upmpdcli.service systemctl disable upmpdcli.service # Initial permissions for certain files. These also get set during moOde Worker startup. chmod 0777 /var/local/www/playhistory.log chmod 0777 /var/local/www/currentsong.txt touch /var/local/www/libcache.json chmod 0777 /var/local/www/libcache.json #ALSAEQ ------------------------------------------------------------------------------------ #alsamixer -D alsaequal # Disabled, need to automate alsaequal.bin generation. chmod 0755 /usr/local/bin/alsaequal.bin chown mpd:audio /usr/local/bin/alsaequal.bin rm /usr/share/alsa/alsa.conf.d/equal.conf mpc enable only 1 #DietPi - Post steps START ----------------------------------------------------------------- # PHP-FPM set to v5 if Jessie # /etc/nginx/nginx.conf # fastcgi_pass unix:/run/php5-fpm.sock; # ??? Support for all webserver types with global site conf? (eg: lighttpd/nginx/apache2) # Need to also look at fastcgi_parms in /etc/nginx # ln -sf /var/local/www/cssw /var/www/cssw # ln -sf /var/local/www/imagesw /var/www/imagesw # ln -sf /var/local/www/jsw /var/www/jsw # ln -sf /var/local/www/templatesw /var/www/templatesw # chown -R www-data:www-data /var/local/www #Remove default .html site rm /var/www/index.h* # Combined /etc/rc.local cat << _EOF_ > /etc/rc.local #!/bin/bash #Precaution: Wait for DietPi Ramdisk to finish while [ ! -f /DietPi/.ramdisk ] do G_DIETPI-NOTIFY 2 "Waiting for DietPi-RAMDISK to finish mounting DietPi to RAM..." sleep 1 done echo -e "\$(cat /proc/uptime | awk '{print \$1}') Seconds" > /var/log/boottime if (( \$(cat /DietPi/dietpi/.install_stage) == 1 )); then /DietPi/dietpi/dietpi-services start fi /DietPi/dietpi/dietpi-banner 0 echo -e " Default Login:\n Username = root\n Password = dietpi\n" #moOde additions SQLDB=/var/local/www/db/moode-sqlite3.db # set cpu govenor RESULT=\$(sqlite3 \$SQLDB "select value from cfg_system where param='cpugov'") echo "\$RESULT" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor /usr/bin/udisks-glue > /dev/null 2>&1 /var/www/command/worker.php > /dev/null 2>&1 exit 0 _EOF_ # moOde worker service # ??? Hangs on /bin/systemd-tty-ask-password-agent --watch # cat << _EOF_ > /etc/systemd/system/moode-worker.service # [Unit] # Description=moOde worker.php service # After=php7.0-fpm.service php5-fpm.service apache2.service lighttpd.service nginx.service # [Service] # Type=forking # StandardOutput=tty # StandardInput=tty # User=root # ExecStart=/bin/bash -c '/var/www/command/worker.php' # [Install] # WantedBy=multi-user.target # _EOF_ sqlite3 /var/local/www/db/moode-sqlite3.db "update cfg_system set value='/DietPi/config.txt' where param='res_boot_config_txt'" Download_Test_Media #DietPi - Post steps END ------------------------------------------------------------------- fi #Google AIY INSTALLING_INDEX=169 if (( ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 )); then Banner_Configuration # - Symlink userdata location for assistant.json ln -sf "$G_FP_DIETPI_USERDATA"/voice-recognizer-raspi/assistant.json /home/dietpi/assistant.json # - Generate cache dir mkdir -p /home/dietpi/.cache/voice-recognizer #Setup soundcard /DietPi/dietpi/func/dietpi-set_hardware soundcard googlevoicehat-soundcard fi } Install_Apply_GPU_Settings(){ local gpu_enabled=0 local gpu_memory=0 #Define Memory Split Modes with installed software #Mode 4 RPI ONLY (Descent HIGH GPU RAM / 192MB) if (( ${aSOFTWARE_INSTALL_STATE[112]} == 2 )); then gpu_enabled=1 gpu_memory=192 #Define Memory Split Modes with installed software #Mode 3 (KODI / DIETPICAM / UAE4ARM / JRiver / MED GPU RAM / 128MB) elif (( ${aSOFTWARE_INSTALL_STATE[31]} == 2 || ${aSOFTWARE_INSTALL_STATE[59]} == 2 || ${aSOFTWARE_INSTALL_STATE[108]} == 2 || ${aSOFTWARE_INSTALL_STATE[148]} == 2 )); then gpu_enabled=1 gpu_memory=128 #Mode 2 (Desktop / LOW GPU RAM) #All DESKTOP_* and OPENTYRIAN elif (( ${aSOFTWARE_INSTALL_STATE[23]} == 2 || ${aSOFTWARE_INSTALL_STATE[24]} == 2 || ${aSOFTWARE_INSTALL_STATE[25]} == 2 || ${aSOFTWARE_INSTALL_STATE[26]} == 2 || ${aSOFTWARE_INSTALL_STATE[51]} == 2 )); then gpu_enabled=1 gpu_memory=64 #Mode 1 - DIETPICLOUDSHELL (forces display output) elif (( ${aSOFTWARE_INSTALL_STATE[62]} == 2 )); then gpu_enabled=1 fi #Apply if (( $gpu_memory > 0 )); then #RPi if (( $G_HW_MODEL < 10 )); then /DietPi/dietpi/func/dietpi-set_hardware gpumemsplit $gpu_memory fi fi if (( $gpu_enabled )); then #RPi if (( $G_HW_MODEL < 10 )); then sed -i "/CONFIG_HDMI_OUTPUT=/c\CONFIG_HDMI_OUTPUT=1" /DietPi/dietpi.txt #odroid C1 elif (( $G_HW_MODEL == 10 )); then sed -i '/setenv hdmioutput /c\setenv hdmioutput "1"' /DietPi/boot.ini sed -i '/setenv vpu /c\setenv vpu "1"' /DietPi/boot.ini sed -i '/setenv m_bpp /c\setenv m_bpp "32"' /DietPi/boot.ini #Odroid C2 elif (( $G_HW_MODEL == 12 )); then sed -i '/setenv nographics /c\setenv nographics "0"' /DietPi/boot.ini fi fi } Check_USB_Drive_Installed(){ USBDRIVE=0 FP_DIETPI_DEDICATED_USBDRIVE=$(df -P | grep -m1 '^/dev/sda1' | awk '{print $6}') #Only enable if mounted if [ -n "$FP_DIETPI_DEDICATED_USBDRIVE" ] && (( $(df -P | grep -ci -m1 "$FP_DIETPI_DEDICATED_USBDRIVE") )); then USBDRIVE=1 fi } Uninstall_Software(){ #NB: systemctl daemon-reload is executed after this func in Uninstall_Software_Finalize() local index=$1 #---------------------------------------------------------------------- #Inform User G_DIETPI-NOTIFY 3 DietPi-Software "Uninstall" echo -e "" G_DIETPI-NOTIFY 0 "Uninstalling ${aSOFTWARE_WHIP_NAME[$index]}: ${aSOFTWARE_WHIP_DESC[$index]}\n" #Was a uninstall event trigged? local valid_input=1 #---------------------------------------------------------------------- #DIETPI SOFTWARE if (( $index == 100 )); then grasshopper_directory='/var/www' rm -R "$grasshopper_directory"/documentation rm -R "$grasshopper_directory"/css rm -R "$grasshopper_directory"/db rm -R "$grasshopper_directory"/exec rm -R "$grasshopper_directory"/includes rm -R "$grasshopper_directory"/install rm -R "$grasshopper_directory"/phpliteadmin rm -R "$grasshopper_directory"/js rm -R "$grasshopper_directory"/setup rm -R "$grasshopper_directory"/pics rm -R "$grasshopper_directory"/themes rm "$grasshopper_directory"/favicon.ico rm "$grasshopper_directory"/index.php #PDF documentation rm "$grasshopper_directory"/Grasshopper* update-rc.d grasshopper remove rm /etc/init.d/grasshopper elif (( $index == 23 )); then G_AGP lxde lxde-* upower policykit-1 iceweasel p7zip-full elif (( $index == 24 )); then G_AGP mate-desktop-environment-extras upower policykit-1 iceweasel p7zip-full elif (( $index == 26 )); then G_AGP x-window-system-core wmaker gnustep gnustep-devel gnustep-games upower policykit-1 iceweasel p7zip-full elif (( $index == 25 )); then G_AGP xfce4 gnome-icon-theme tango-icon-theme iceweasel p7zip-full elif (( $index == 22 )); then G_AGP quiterss elif (( $index == 30 )); then G_RUN_CMD dpkg -P nomachine elif (( $index == 29 )); then G_AGP xrdp elif (( $index == 44 )); then G_AGP transmission-daemon rm /etc/init.d/transmission-daemon &> /dev/null rm /etc/systemd/system/transmission-daemon.service &> /dev/null elif (( $index == 47 )); then #ownCloud # Remove background cron job crontab -u www-data -l | grep -v '/var/www/owncloud/cron.php' | crontab -u www-data - # Disable and remove webserver configs a2dissite owncloud 2>/dev/null rm /etc/apache2/sites-available/owncloud.conf 2>/dev/null rm /etc/nginx/sites-dietpi/owncloud.config 2>/dev/null # Find datadir for backups G_DIETPI-NOTIFY 2 "DietPi will perform an automated backup of your ownCloud database and installation directory, which will be stored inside your ownCloud data directory.\nThe data directory won't be removed. So you can at any time recover your whole ownCloud instance.\nRemove the data directory manually, if you don't need it anymore." local datadir=$(grep -m1 "'datadirectory'" /var/www/owncloud/config/config.php | awk '{print $3}' | sed "s/[',]//g") [ -n "$datadir" ] || datadir="$G_FP_DIETPI_USERDATA/owncloud_data" # Drop MariaDB user and database systemctl start mysql mysql -e "drop user $(grep -m1 "'dbuser'" /var/www/owncloud/config/config.php | awk '{print $3}' | sed "s/,//")@$(grep -m1 "'dbhost'" /var/www/owncloud/config/config.php | awk '{print $3}' | sed "s/,//")" mysql -e "drop user $(grep -m1 "'dbuser'" /var/www/owncloud/config/config.php | awk '{print $3}' | sed "s/,//")" 2> /dev/null [ -d "$G_FP_DIETPI_USERDATA"/mysql/owncloud ] && mysqldump owncloud > "$datadir"/dietpi-owncloud-database-backup.sql mysqladmin drop owncloud -f # Backup ownCloud installation folder cp -a /var/www/owncloud/. "$datadir"/dietpi-owncloud-installation-backup # Remove ownCloud installation folder rm -R /var/www/owncloud elif (( $index == 114 )); then #Nextcloud crontab -u www-data -l | grep -v '/var/www/nextcloud/cron.php' | crontab -u www-data - # Disable and remove webserver configs a2dissite nextcloud 2>/dev/null rm /etc/apache2/sites-available/nextcloud.conf 2>/dev/null rm /etc/nginx/sites-dietpi/nextcloud.config 2>/dev/null lighttpd-disable-mod dietpi-nextcloud 2>/dev/null rm /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf 2>/dev/null # Find datadir for backups G_DIETPI-NOTIFY 2 "DietPi will perform an automated backup of your Nextcloud database and installation directory, which will be stored inside your Nextcloud data directory.\nThe data directory won't be removed. So you can at any time recover your whole Nextcloud instance.\nRemove the data directory manually, if you don't need it anymore." local datadir=$(grep -m1 "'datadirectory'" /var/www/nextcloud/config/config.php | awk '{print $3}' | sed "s/[',]//g") [ -n "$datadir" ] || datadir="$G_FP_DIETPI_USERDATA/nextcloud_data" # Drop MariaDB user and database systemctl start mysql mysql -e "drop user $(grep -m1 "'dbuser'" /var/www/nextcloud/config/config.php | awk '{print $3}' | sed "s/,//")@$(grep -m1 "'dbhost'" /var/www/nextcloud/config/config.php | awk '{print $3}' | sed "s/,//")" mysql -e "drop user $(grep -m1 "'dbuser'" /var/www/nextcloud/config/config.php | awk '{print $3}' | sed "s/,//")" 2> /dev/null [ -d "$G_FP_DIETPI_USERDATA"/mysql/nextcloud ] && mysqldump nextcloud > "$datadir"/dietpi-nextcloud-database-backup.sql mysqladmin drop nextcloud -f # Backup Nextcloud installation folder cp -a /var/www/nextcloud/. "$datadir"/dietpi-nextcloud-installation-backup # Remove Nextcloud installation folder rm -R /var/www/nextcloud elif (( $index == 83 )); then G_AGP apache2 elif (( $index == 85 )); then G_AGP nginx elif (( $index == 84 )); then G_AGP lighttpd elif (( $index == 88 )); then G_AGP mariadb-server ### Also for MariaDB? # - custom confs #rm /etc/mysql/conf.d/reduce_resources.cnf # - SQL store rm /var/lib/mysql &> /dev/null || rm -R /var/lib/mysql &> /dev/null #in case of symlink or folder rm -R "$G_FP_DIETPI_USERDATA"/mysql elif (( $index == 87 )); then G_AGP sqlite3 elif (( $index == 91 )); then G_AGP "$PHP_APT_PACKAGE_NAME"-redis redis-server redis-tools elif (( $index == 89 )); then rm "$FP_PHP_BASE_DIR"/fpm/pool.d/www.conf rm "$FP_PHP_BASE_DIR"/mods-available/dietpi.ini 2> /dev/null G_AGP "$PHP_APT_PACKAGE_NAME"-* libapache2-mod-"$PHP_APT_PACKAGE_NAME" rm /var/www/phpinfo.php rm /var/www/apc.php rm /var/www/opcache.php # temp php uploads, if it was created rm -R /var/tmp/php_upload_tmp 2> /dev/null elif (( $index == 90 )); then systemctl start mysql mysqladmin drop phpmyadmin -f mysql -e "drop user 'phpmyadmin'@'localhost'" G_AGP phpmyadmin elif (( $index == 54 )); then systemctl start mysql mysqladmin drop phpbb3 -f mysql -e "drop user phpbb3@localhost" rm -R /var/www/phpBB3 elif (( $index == 115 )); then G_RUN_CMD dpkg -P webmin elif (( $index == 32 )); then rm /usr/bin/ympd rm /etc/systemd/system/ympd.service elif (( $index == 128 )); then #apt-mark auto libavformat57 libupnp6 libao-common libao4 libasound2 libasound2-data libasyncns0 libaudiofile1 libavahi-client3 libavahi-common-data libavahi-common3 libavcodec56 libavformat56 libavresample2 libavutil54 libbinio1ldbl libcaca0 libcdio-cdda1 libcdio-paranoia1 libcdio13 libcups2 libcurl3-gnutls libdirectfb-1.2-9 libdnet libfaad2 libflac8 libfluidsynth1 libgme0 libgomp1 libgsm1 libice6 libid3tag0 libiso9660-8 libjack-jackd2-0 libjson-c2 libldb1 libmad0 libmikmod3 libmms0 libmodplug1 libmp3lame0 libmpcdec6 libmpg123-0 libnfs4 libntdb1 libogg0 libopenal-data libopenal1 libopenjpeg5 libopus0 liborc-0.4-0 libpulse0 libresid-builder0c2a libroar2 libsamplerate0 libschroedinger-1.0-0 libsdl1.2debian libshout3 libsidplay2 libsidutils0 libslp1 libsm6 libsmbclient libsndfile1 libsoxr0 libspeex1 libspeexdsp1 libsqlite3-0 libtalloc2 libtdb1 libtevent0 libtheora0 libupnp6 libva1 libvorbis0a libvorbisenc2 libvorbisfile3 libvpx1 libwavpack1 libwbclient0 libwildmidi-config libwildmidi1 libx11-6 libx11-data libx11-xcb1 libx264-142 libxau6 libxcb1 libxdmcp6 libxext6 libxi6 libxtst6 libxvidcore4 libyajl2 libzzip-0-13 mime-support python python-talloc python2.7 samba-libs x11-common file &> /dev/null apt-mark unhold mpd 1> /dev/null (( $G_DISTRO == 3 && $G_HW_ARCH != 3 )) && G_AGP mpd libmpdclient2 || G_RUN_CMD dpkg -P mpd libmpdclient2 userdel -f mpd &> /dev/null rm /lib/systemd/system/mpd.service rm -R "$G_FP_DIETPI_USERDATA"/.mpd_cache elif (( $index == 121 )); then rm /etc/systemd/system/roonbridge.service rm -R /etc/roonbridge elif (( $index == 122 )); then rm /etc/systemd/system/node-red.service rm "$HOME"/.node-red rm -R "$G_FP_DIETPI_USERDATA"/node-red userdel -f nodered elif (( $index == 123 )); then if (( $G_DISTRO > 4 )); then G_AGP mosquitto else #apt-mark auto libssl1.0.0 dpkg -P mosquitto fi elif (( $index == 124 )); then #apt-mark auto gcc-6-base libstdc++6 &> /dev/null G_RUN_CMD dpkg -P networkaudiod elif (( $index == 125 )); then G_AGP tomcat8 elif (( $index == 126 )); then G_AGP openmediavault rm /etc/apt/sources.list.d/openmediavault.list elif (( $index == 129 )); then rm -R /var/www/ompd systemctl start mysql mysqladmin drop ompd -f mysql -e "drop user ompd@localhost" elif (( $index == 130 )); then G_AGP python-pip python3-pip elif (( $index == 131 )); then rm /etc/systemd/system/blynkserver.service rm -R /etc/blynkserver elif (( $index == 132 )); then rm /etc/systemd/system/aria2.service rm /usr/local/bin/aria2c rm -R /var/www/aria2 G_AGP aria2 elif (( $index == 133 )); then rm /etc/systemd/system/yacy.service rm -R /etc/yacy elif (( $index == 134 )); then #apt-mark auto libjpeg8 libpng12-0 libfontconfig1 libssl1.0.0 &> /dev/null rm /etc/systemd/system/tonido.service rm -R /etc/tonido rm "$HOME"/tonido rm "$HOME"/TonidoSync rm "$HOME"/TonidoSyncData elif (( $index == 135 )); then G_AGP darkice icecast2 rm /etc/systemd/system/darkice.service elif (( $index == 136 )); then #apt-mark auto v4l-utils python python-dev libssl-dev libcurl4-openssl-dev libjpeg-dev zlib1g-dev libx264-142 libavcodec56 libavformat56 libmysqlclient18 libswscale3 libpq5 &> /dev/null (( $G_DISTRO > 3 )) && G_AGP motion || G_RUN_CMD dpkg -P motion rm -R /etc/motioneye rm /etc/systemd/system/motioneye.service pip uninstall -y motioneye elif (( $index == 137 )); then G_AGP cloudprint-service if (( $G_DISTRO == 3 )); then rm /etc/apt/sources.list.d/cloudprint.list G_AGUP fi elif (( $index == 138 )); then rm -R /etc/vhusbd rm /etc/systemd/system/virtualhere.service elif (( $index == 139 )); then rm -R /etc/sabnzbd rm /etc/systemd/system/sabnzbd.service elif (( $index == 140 )); then G_RUN_CMD dpkg -P libsdl2 libsdl2-image libsdl2-mixer libsdl2-net libsdl2-ttf libsmpeg2 elif (( $index == 141 )); then rm -R "$G_FP_DIETPI_USERDATA"/spotify-connect-web rm /etc/systemd/system/spotify-connect-web.service elif (( $index == 142 )); then rm -R /etc/couchpotato rm -R "$G_FP_DIETPI_USERDATA"/couchpotato rm /etc/init.d/couchpotato #userdel -f couchpotato elif (( $index == 143 )); then systemctl start mysql mysqladmin drop koel -f mysql -e "drop user koel@localhost" rm -R /var/www/koel rm /etc/systemd/system/koel.service elif (( $index == 144 )); then G_AGP nzbdrone rm /etc/systemd/system/sonarr.service rm /etc/apt/sources.list.d/sonarr.list G_AGUP elif (( $index == 145 )); then rm -R /opt/Radarr rm /etc/systemd/system/radarr.service elif (( $index == 146 )); then rm -R /opt/plexpy rm -R "$G_FP_DIETPI_USERDATA"/plexpy rm /etc/systemd/system/plexpy.service elif (( $index == 147 )); then rm -R /opt/jackett rm /etc/systemd/system/jackett.service elif (( $index == 148 )); then G_AGP mediacenter22 elif (( $index == 149 )); then rm -R "$G_FP_DIETPI_USERDATA"/nzbget rm /etc/systemd/system/nzbget.service elif (( $index == 155 )); then rm -R "$G_FP_DIETPI_USERDATA"/htpc-manager rm /etc/systemd/system/htpc-manager.service elif (( $index == 150 )); then #G_AGP mono-runtime #shared lib rm /etc/apt/sources.list.d/mono-xamarin.list G_AGUP elif (( $index == 151 )); then G_AGP nvidia-driver nvidia-xconfig libgl1-nvidia-glx:i386 elif (( $index == 152 )); then G_AGP avahi-daemon elif (( $index == 153 )); then rm -R "$G_FP_DIETPI_USERDATA"/octoprint rm $(which octoprint) rm -R "$HOME"/.octoprint rm /etc/systemd/system/octoprint.service elif (( $index == 154 )); then rm -R "$G_FP_DIETPI_USERDATA"/roonserver rm /etc/systemd/system/roonserver.service elif (( $index == 156 )); then G_AGP steam rm -R "$HOME"/.steam rm -R "$G_FP_DIETPI_USERDATA"/steam elif (( $index == 119 )); then G_AGP cava rm "$HOME/.config/cava/config" rm "$HOME/cava.psf" elif (( $index == 118 )); then G_AGP mopidy rm /etc/apt/sources.list.d/mopidy.list pip uninstall -y Mopidy-MusicBox-Webclient Mopidy-Local-Images elif (( $index == 31 )); then G_AGP kodi #+Odroids G_AGP kodi-odroid rm /usr/share/applications/kodi.desktop rm ~/Desktop/kodi.desktop elif (( $index == 39 )); then G_AGP minidlna elif (( $index == 51 )); then G_AGP ibsdl1.2debian libsdl-net1.2 rm -R /usr/local/games/opentyrian rm /usr/share/applications/opentyrian.desktop rm ~/Desktop/opentyrian.desktop elif (( $index == 59 )); then G_AGP gpac rm -R /var/www/dietpicam rm /opt/vc/bin/raspimjpeg rm /usr/bin/raspimjpeg rm /var/lib/dietpi/dietpi-software/services/raspimjpeg.service rm /etc/raspimjpeg elif (( $index == 45 )); then G_AGP deluged deluge-web deluge-webui deluge-console rm /var/lib/dietpi/dietpi-software/services/deluge.service rm -R ~/.config/deluge elif (( $index == 94 )); then G_AGP proftpd-basic elif (( $index == 96 )); then G_AGP samba samba-common-bin elif (( $index == 95 )); then G_AGP vsftpd elif (( $index == 109 )); then G_AGP nfs-kernel-server elif (( $index == 67 )); then rm /usr/local/bin/noip2 rm /etc/systemd/system/noip2.service elif (( $index == 106 )); then rm -R /var/www/raspcontrol rm -R /etc/raspcontrol elif (( $index == 63 )); then rm -R /var/www/linuxdash elif (( $index == 93 )); then G_AGP dnsmasq pihole uninstall #https://github.com/Fourdee/DietPi/issues/753 chmod 774 /etc/lighttpd/lighttpd.conf &> /dev/null rm -R /etc/pihole rm -R /etc/.pihole rm -R /var/www/html/admin # - symlinks rm /var/www/pihole rm /var/www/admin elif (( $index == 33 || $index == 34 )); then G_RUN_CMD dpkg -P subsonic rm -R /var/subsonic elif (( $index == 71 )); then update-rc.d webiopi remove rm -R /etc/webiopi rm -R /usr/share/webiopi rm /usr/bin/webiopi rm /etc/init.d/webiopi elif (( $index == 68 )); then # <= v150 (weaved) rm -R /etc/weaved rm -R "$HOME"/weaved_software rm "$HOME"/weaved_setup.bin # Remot3.it G_RUN_CMD dpkg -P weavedconnectd elif (( $index == 62 )); then #Kill systemctl stop dietpi-cloudshell rm /etc/systemd/system/dietpi-cloudshell.service # - For old version of dietpi-cloudshell, without service. killall -w dietpi-cloudshell #Disable auto login, revert boot index to console /DietPi/dietpi/dietpi-autostart 0 elif (( $index == 98 )); then update-rc.d haproxy remove rm /etc/init.d/haproxy rm -r /etc/haproxy #Shared dev libraries. Leave these installed #G_AGP libpcre3-dev libssl-dev elif (( $index == 35 )); then #apt-mark auto libxml-parser-perl zlib1g-dev libjpeg-dev libpng-dev libjpeg62-turbo-dev &> /dev/null G_RUN_CMD dpkg -P logitechmediaserver rm /var/lib/dietpi/dietpi-software/services/squeezeboxserver.service rm -R /var/lib/squeezeboxserver rm -R /usr/share/squeezeboxserver elif (( $index == 55 )); then systemctl start mysql mysqladmin drop wordpress -f mysql -e "drop user wordpress@localhost" rm -R /var/www/wordpress elif (( $index == 27 || $index == 28 || $index == 120 )); then G_AGP tightvncserver G_AGP vnc4server G_AGP x11vnc G_AGP realvnc-vnc-server G_AGP tigervnc-* rm /etc/systemd/system/vncserver.service rm /etc/init.d/vncserver rm /usr/local/bin/vncserver rm -R "$HOME"/.vnc # + RealVNC services systemctl disable vncserver-x11-serviced.service systemctl disable vncserver-virtuald.service elif (( $index == 73 )); then G_AGP fail2ban elif (( $index == 64 )); then rm -R /var/www/phpsysinfo elif (( $index == 56 )); then rm /var/www/gallery/index.php rm -R /var/www/gallery/_sfpg_data elif (( $index == 40 )); then rm -R /var/www/ampache #drop database systemctl start mysql mysqladmin drop ampache -f mysql -e "drop user ampache@localhost" elif (( $index == 117 )); then rm /etc/apt/sources.list.d/swupdate.openvpn.net.list pivpn -u userdel -f pivpn elif (( $index == 97 )); then G_AGP openvpn rm -R /etc/openvpn &> /dev/null elif (( $index == 92 )); then if (( $G_DISTRO >= 4 )); then G_AGP python-certbot-apache python-certbot-nginx certbot fi rm -R /etc/letsencrypt_scripts &>/dev/null rm -R /etc/certbot_scripts &>/dev/null elif (( $index == 69 )); then G_AGP python-rpi.gpio python3-rpi.gpio elif (( $index == 72 )); then G_AGP i2c-tools #Disable /DietPi/dietpi/func/dietpi-set_hardware i2c disable elif (( $index == 70 )); then rm -R /root/wiringPi* &> /dev/null elif (( $index == 60 )); then #apt-mark auto libssl1.0.0 &> /dev/null G_AGP hostapd isc-dhcp-server rm /etc/dhcp/dhcpd.conf &> /dev/null rm /etc/hostapd/hostapd.conf &> /dev/null rm /etc/default/isc-dhcp-server &> /dev/null rm /etc/default/hostapd &> /dev/null rm /etc/iptables.ipv4.nat &> /dev/null # - remove binary (used a -f trigger to detect wifi hotspot mode in dietpi-config). rm /usr/sbin/hostapd &> /dev/null rm /usr/sbin/hostapd_cli &> /dev/null #Set Wlan back to inactive and ready for use with dietpi-config. local wifi_index=$(sed -n 2p /DietPi/dietpi/.network) # - Remove all entries below wlan, so we can recreate them. sed -i '/allow-hotplug wlan/q0' /etc/network/interfaces # - Disable wlan sed -i "/allow-hotplug wlan/c\#allow-hotplug wlan$wifi_index" /etc/network/interfaces # - Add default wifi settings to network interfaces config cat << _EOF_ >> /etc/network/interfaces iface wlan$wifi_index inet dhcp address 192.168.0.101 netmask 255.255.255.0 gateway 192.168.0.1 wireless-power off wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf #dns-nameservers 8.8.8.8 8.8.4.4 _EOF_ # - Flush IP tables iptables -F iptables -t nat -F iptables-save > /etc/iptables.ipv4.nat elif (( $index == 61 )); then G_AGP tor # - uninstall WIFIHOTSPOT ALSO. Due to IPtables needing reset. Uninstall_Software 60 elif (( $index == 37 )); then #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? #https://github.com/Fourdee/DietPi/blob/testing/dietpi/dietpi-software#L5968 #G_RUN_CMD dpkg -P 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 userdel -f shairport-sync elif (( $index == 38 )); then G_AGP brutefir rm -R /etc/BruteFIR rm /var/lib/dietpi/dietpi-software/services/brutefir.service rm /etc/asound.conf rm /etc/modules-load.d/brutefir-alsa-loopback.conf rm /etc/modprobe.d/brutefir-alsa-loopback.conf elif (( $index == 48 )); then rm -R /var/www/pydio #drop database systemctl start mysql mysqladmin drop pydio -f mysql -e "drop user pydio@localhost" elif (( $index == 36 )); then G_AGP squeezelite rm -R /usr/bin/squeezelite* rm /etc/systemd/system/squeezelite.service elif (( $index == 99 )); then rm -R /etc/emonhub rm /etc/init.d/emonhub rm /etc/default/emonhub elif (( $index == 66 )); then G_RUN_CMD dpkg -P rpimonitor elif (( $index == 57 )); then rm -R /var/www/baikal #drop database systemctl start mysql mysqladmin drop baikal -f mysql -e "drop user baikal@localhost" elif (( $index == 65 )); then #apt-mark auto zlib1g-dev &> /dev/null #all rm /etc/systemd/system/netdata.service userdel -f netdata groupdel netdata #1.2.0+ G_RUN_CMD dpkg -P netdata #1.0.0 rm /usr/sbin/netdata rm -R /etc/netdata rm -R /usr/share/netdata rm -R /usr/libexec/netdata rm -R /var/cache/netdata rm -R /var/log/netdata elif (( $index == 43 )); then G_AGP mumble-server elif (( $index == 41 )); then G_AGP emby-server embymagick rm /etc/apt/sources.list.d/emby-server.list G_AGUP elif (( $index == 58 )); then rm -R /etc/openbazaar-server rm /etc/systemd/system/openbazaar.service elif (( $index == 42 )); then (( $G_HW_ARCH == 10 )) && G_RUN_CMD dpkg -P plexmediaserver plexmediaserver-installer || G_AGP plexmediaserver* rm -R /var/lib/plexmediaserver rm /etc/apt/sources.list.d/plex.list &> /dev/null G_AGUP elif (( $index == 52 )); then rm -R /etc/cuberite rm /etc/systemd/system/cuberite.service elif (( $index == 53 )); then rm -R "$USERDATA_DIRECTORY"/mineos rm -R /var/games/minecraft rm /etc/supervisor/conf.d/mineos.conf supervisorctl reload rm /usr/local/bin/mineos userdel -f mineos elif (( $index == 49 )); then rm -R /etc/gogs rm /etc/systemd/system/gogs.service rm /var/log/gogs_daemon.log rm /var/log/gogs.log systemctl start mysql mysqladmin drop gogs -f mysql -e "drop user gogs@localhost" elif (( $index == 46 )); then G_AGP qbittorrent-nox rm /etc/systemd/system/qbittorrent.service rm -R "$HOME"/.config/qBittorrent elif (( $index == 50 )); then rm -R /etc/syncthing rm /usr/bin/syncthing &> /dev/null # DietPi v158 <= rm /etc/systemd/system/syncthing.service rm -R "$G_FP_DIETPI_USERDATA"/syncthing elif (( $index == 116 )); then rm /etc/systemd/system/sickrage.service rm -R /etc/sickrage elif (( $index == 107 )); then G_AGP rtorrent rm -R /var/www/rutorrent rm "$HOME"/.rtorrent.rc rm /etc/systemd/system/rtorrent.service # - webserver rutorrent user/pw settings rm /etc/.rutorrent-htaccess # lighttpd #Remove from #RUTORRENT_DIETPI to #RUTORRENT_DIETPI in /etc/lighttpd/lighttpd.conf # nginx rm /etc/nginx/sites-dietpi/rutorrent.config # apache2 rm /etc/apache2/sites-available/rutorrent.conf elif (( $index == 108 )); then rm -R /etc/amiberry rm /etc/systemd/system/amiberry.service rm /etc/systemd/system/amiberry-sdl2.service #Disable autostart, revert boot index to console /DietPi/dietpi/dietpi-autostart 0 elif (( $index == 112 )); then rm "$G_FP_DIETPI_USERDATA"/dxx-rebirth/* rm -R "$G_FP_DIETPI_USERDATA"/dxx-rebirth/descent_1_game rm -R "$G_FP_DIETPI_USERDATA"/dxx-rebirth/descent_2_game #Remove symlinks rm "$HOME"/.d1x-rebirth rm "$HOME"/.d2x-rebirth rm "$HOME"/Desktop/dxx-rebirth.desktop rm /usr/share/applications/dxx-rebirth.desktop elif (( $index == 113 )); then #apt-mark auto libgnome-keyring0 libnspr4 libnss3 libnss3-1d libspeechd2 libxslt1.1 libxss1 xdg-utils libgnome-keyring-common libltdl7 &> /dev/null apt-mark unhold chromium chromedriver rm /etc/chromium.d/custom_flags rm "$HOME"/.chromium-browser.init (( $G_DISTRO >=4 )) && G_AGP chromium* || G_RUN_CMD dpkg -P chromium chromedriver elif (( $index == 157)); then # Remove installationof HA. rm -R /srv/homeassistant # Remove the user and all files. This removed pyenv for this user as well. userdel -r -f homeassistant groupdel homeassistant # Remove the service. rm /etc/systemd/system/home-assistant.service elif (( $index == 165 )); then # Delete systemd files rm /etc/systemd/system/gitea.service # Delete data rm -R "$G_FP_DIETPI_USERDATA"/gitea rm -R /var/log/gitea # drop/delete database systemctl start mysql mysqladmin drop gitea -f mysql -e "drop user gitea@localhost" elif (( $index == 166 )); then rm /etc/systemd/system/pi-spc.service rm -R /var/lib/dietpi/dietpi-software/installed/pi-spc elif (( $index == 167 )); then G_AGP raspotify rm /etc/apt/sources.list.d/raspotify.list G_AGUP elif (( $index == 168 )); then echo -e "pending" elif (( $index == 169 )); then rm -R "$G_FP_DIETPI_USERDATA"/voice-recognizer-raspi rm /etc/systemd/system/voice-recognizer.service rm /etc/systemd/system/alsa-init.service rm -R /home/dietpi/assistant.json elif (( $index == 170 )); then Reset_NTPD G_AGP ntp elif (( $index == 158 )); then # Remove service systemctl stop minio.service systemctl disable minio.service # Remove files rm /usr/local/bin/minio rm /etc/systemd/system/minio.service rm /etc/default/minio # Remove userdel userdel -r -f minio-user elif (( $index == 161 )); then /etc/init.d/bdd stop sleep 2 killall --user bd sleep 2 rm /etc/rc3.d/S99bdd rm /etc/rc4.d/S99bdd rm /etc/rc2.d/S99bdd rm /etc/rc5.d/S99bdd rm /etc/init.d/bdd userdel -r bd elif (( $index == 162 )); then if (( $G_HW_ARCH == 10 )); then # remove docker and all its unused dependencies - x86_64 package name is different G_AGP docker-ce else # remove docker and all its unused dependencies - ARM package name G_AGP docker-engine fi # delete data files - dietpi rm -r "$G_FP_DIETPI_USERDATA"/docker-data # remove default unused folder rm -r /var/lib/docker elif (( $index == 164 )); then # Remove Service file rm /etc/systemd/system/nukkit.service # remove nukkit java file/folder rm -r /usr/local/bin/nukkit elif (( $index == 163 )); then #apt-mark auto libupnp6 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-alsa &> /dev/null G_RUN_CMD dpkg -P gmrender rm /etc/systemd/system/gmrender.service elif (( $index == 159 || $index == 160 )); then rm -R /var/www/allo systemctl start mysql mysqladmin drop allo_db -f mysql -e "drop user allo_db@localhost" #---------------------------------------------------------------------- #LINUX SOFTWARE elif (( $index == 15 )); then G_AGP tcpdump elif (( $index == 14 )); then G_AGP nload elif (( $index == 13 )); then G_AGP mtr-tiny elif (( $index == 11 )); then G_AGP iptraf elif (( $index == 10 )); then G_AGP iftop elif (( $index == 19 )); then G_AGP jed elif (( $index == 3 )); then G_AGP mc elif (( $index == 18 )); then G_AGP emacs elif (( $index == 20 || $i == 21 )); then G_AGP vim vim-tiny elif (( $index == 127 )); then G_AGP neovim elif (( $index == 0 )); then #This also removes OpenSSH server. So lets check OpenSSH server isnt installed before hand. if (( $(dpkg -l | grep -ci -m1 'openssh-server') == 0 )); then G_AGP openssh-client fi elif (( $index == 1 )); then umount -f /mnt/samba G_AGP smbclient #Disable in fstab sed -i '/\/mnt\/samba/c\#\/mnt\/samba . Please use dietpi-config and the Networking Options: NAS menu to setup this mount' /etc/fstab #Add info file for installation method. echo -e "Samba client can be installed and setup by DietPi-Config.\nSimply run: dietpi-config and select the Networking Options: NAS/Misc menu" > /mnt/samba/readme.txt elif (( $index == 111 )); then G_RUN_CMD dpkg -P urbackup-server #+sourcebuild rm /etc/systemd/system/urbackupsrv.service rm /etc/default/urbackupsrv rm /etc/logrotate.d/urbackupsrv rm /usr/sbin/urbackupsrv rm /usr/bin/urbackup_snapshot_helper rm /usr/bin/urbackupsrv rm -R /usr/share/urbackup elif (( $index == 110 )); then umount -f /mnt/nfs_client #nfs-kernel-server depends on nfs-common if (( ${aSOFTWARE_INSTALL_STATE[109]} == 0 )); then G_AGP nfs-common fi #Disable in fstab sed -i '/\/mnt\/nfs_client/c\#\/mnt\/nfs_client . Please use dietpi-config and the Networking Options: NAS menu to setup this mount' /etc/fstab #Add info file for installation method. echo -e "NFS client can be installed and setup by DietPi-Config.\nSimply run: dietpi-config and select the Networking Options: NAS/Misc menu" > /mnt/nfs_client/readme.txt elif (( $index == 16 )); then G_AGP build-essential elif (( $index == 17 )); then G_AGP git elif (( $index == 5 )); then G_AGP alsa-utils elif (( $index == 6 )); then #apt-mark auto aml-libs-odroid mali450-odroid xf86-video-mali-odroid libump* xf86-video-fbturbo* firmware-samsung xf86-video-armsoc-odroid malit628-odroid &> /dev/null G_AGP xcompmgr xterm xinit xauth xserver-xorg dbus-x11 xfonts-base x11-xserver-utils x11-common x11-utils rm /etc/xdg/autostart/xcompmgr.desktop /etc/X11/xorg.conf &> /dev/null elif (( $index == 2 )); then umount -f /mnt/ftp_client G_AGP curlftpfs #Disable in fstab sed -i '/\/mnt\/ftp_client/c\#\/mnt\/ftp_client . Please use dietpi-config and the Networking Options: NAS menu to setup this mount' /etc/fstab #Add info file for installation method. echo -e "FTP client mount can be installed and setup by DietPi-Config.\nSimply run: dietpi-config and select the Networking Options: NAS/Misc menu" > /mnt/ftp_client/readme.txt elif (( $index == 7 )); then G_AGP ffmpeg # + RPi, use dpkg -P as packages were installed via dpkg -i and APT can produce error/terminate dietpi-software: # https://github.com/Fourdee/DietPi/issues/1352#issuecomment-354552622 (( $G_HW_MODEL < 10 )) && G_RUN_CMD dpkg -P libx264 libmp3lame libfdk-aac elif (( $index == 8 )); then G_AGP openjdk-8-jdk rm /etc/apt/preferences.d/99-dietpi-openjdk-8-jdk &> /dev/null elif (( $index == 104 )); then G_AGP dropbear* #stretch | dropbear-initramfs dropbear-run elif (( $index == 105 )); then G_AGP openssh-* # This also clears Openssh-client aSOFTWARE_INSTALL_STATE[0]=0 elif (( $index == 103 )); then sed -i '/\/var\/log/c\#\/var\/log DietPi Ramlog Disabled' /etc/fstab elif (( $index == 101 )); then G_AGP logrotate elif (( $index == 102 )); then G_AGP rsyslog elif (( $index == 9 )); then 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 rm /usr/local/bin/node elif (( $index == 4 )); then G_AGP vifm else G_DIETPI-NOTIFY 2 "Software index $index is unknown, or, has no removal code." valid_input=0 fi #---------------------------------------------------------------------- #log to .uninstalled file if [ ! -f /DietPi/dietpi/.uninstalled ]; then echo -e "DietPi Uninstall Software Log\n----------------------\n" > /DietPi/dietpi/.uninstalled fi echo -e "$index | $(date)" >> /DietPi/dietpi/.uninstalled #Update array installed state aSOFTWARE_INSTALL_STATE[$index]=0 #---------------------------------------------------------------------- #Reset error handler (eg: for usermsg clear) G_ERROR_HANDLER_RESET #---------------------------------------------------------------------- } Uninstall_Software_Finalize(){ #Purge G_DIETPI-NOTIFY 3 DietPi-Software "Removing packages that are no longer required" apt-get autoremove --purge -y #Check if we need to clear DietPi choices local fp_temp='/tmp/.dietpi-uninstall_dpkg' dpkg --get-selections | awk '{print $1}' > "$fp_temp" if (( ! $(grep -ci -m1 '^openssh-server' "$fp_temp") && ! $(grep -ci -m1 '^dropbear' "$fp_temp") )); then INDEX_SSHSERVER_CURRENT=0 INDEX_SSHSERVER_TARGET=0 fi if (( ! $(grep -ci -m1 '^samba$' "$fp_temp") && ! $(grep -ci -m1 '^proftpd-basic' "$fp_temp") )); then INDEX_FILESERVER_CURRENT=0 INDEX_FILESERVER_TARGET=0 fi if (( $(grep -ci -m1 '#/var/log' /etc/fstab) && ! $(grep -ci -m1 '^rsyslog' "$fp_temp") && ! $(grep -ci -m1 '^logrotate' "$fp_temp") )); then INDEX_LOGGING_CURRENT=0 INDEX_LOGGING_TARGET=0 fi rm "$fp_temp" systemctl daemon-reload } Run_Installations(){ #------------------------------------------------------------ #Abort if time sync is incomplete Check_NTPD_Status #------------------------------------------------------------ #Disable powersaving on Main screen during installation setterm -blank 0 -powersave off 2> /dev/null #------------------------------------------------------------ # Unmask all services: https://github.com/Fourdee/DietPi/issues/1320 /DietPi/dietpi/dietpi-services unmask all # Stop Services /DietPi/dietpi/dietpi-services stop #------------------------------------------------------------ #Generate Swapfile during 1st run (moved from boot: https://github.com/Fourdee/DietPi/issues/1270#issue-278797206) if (( $G_DIETPI_INSTALL_STAGE == 0 )); then /DietPi/dietpi/func/dietpi-set_dphys-swapfile $(grep -m1 '^AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/.*=//') fi #------------------------------------------------------------ #Generate userdata folders: Create_UserContent_Folders #------------------------------------------------------------ #Set current path to home folder cd "$HOME" #Update Apt Banner_Apt_Update #Always clean and update apt, before running installs. apt-get clean G_AGUP #Simluated apt installation to check for failures related to apt-cache. G_DIETPI-NOTIFY 2 "Running apt simulation to check for errors, please wait..." local package_to_test='bash-doc' G_AGI $package_to_test -s #Upgrade Apt Banner_Setup Banner_Apt_Update G_AGUG #Generate dir for dietpi-software installed "non-service" based control scripts mkdir -p /var/lib/dietpi/dietpi-software/services chmod -R +x /var/lib/dietpi/dietpi-software/services #Disable software installation, if user input is required for automated installs Install_Disable_Requires_UserInput #Apply DietPi choice systems Apply_FileServer_Choices Apply_SSHServer_Choices Apply_Logging_Choices #Apply DietPi preference systems Apply_Webserver_Preference #Update required software that needs to be installed Install_Flag_Prereq_Software #Install Linux Software /DietPi/dietpi/dietpi-services stop Install_Linux_Software #Install DietPi Optimized Software /DietPi/dietpi/dietpi-services stop Install_Dietpi_Software #Apply Uninstall script created by DietPi choice system Uninstall_NonSelected_Choices #Apply DietPi configurations and optimizations /DietPi/dietpi/dietpi-services stop Banner_Configs Install_Apply_Configs Install_Apply_Permissions &> /dev/null #Apply autostart index local autostart_current=$(cat /DietPi/dietpi/.dietpi-autostart_index) /DietPi/dietpi/dietpi-autostart $autostart_current #Disable services so DietPi-services can take control (DietPi will start all services from rc.local) /DietPi/dietpi/dietpi-services dietpi_controlled #Install finished, set all installed software to state 2 (installed) for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then aSOFTWARE_INSTALL_STATE[$i]=2 fi done #Apply GPU Memory Splits: NB, this only checks for installed state '=2' Install_Apply_GPU_Settings #Write to .install File Write_InstallFileList #DietPi-Automation if (( $G_DIETPI_INSTALL_STAGE == 0 )); then #Apply Timezone if [ "$AUTOINSTALL_TIMEZONE" != "Europe/London" ]; then echo -e "\nDietPi: Setting Timezone = $AUTOINSTALL_TIMEZONE" rm /etc/timezone rm /etc/localtime ln -fs /usr/share/zoneinfo/$AUTOINSTALL_TIMEZONE /etc/localtime dpkg-reconfigure -f noninteractive tzdata fi #Apply Language (Locale) if [ "$AUTOINSTALL_LANGUAGE" != "en_GB.UTF-8" ]; then G_DIETPI-NOTIFY 2 "Setting Locale $AUTOINSTALL_LANGUAGE. Please wait" # Sanity, No result, revert back to default if [ -z "$AUTOINSTALL_LANGUAGE" ]; then AUTOINSTALL_LANGUAGE='en_GB.UTF-8' fi # - Re-apply locale + auto install en_GB.UTF-8 alongside /DietPi/dietpi/func/dietpi-set_software locale "$AUTOINSTALL_LANGUAGE" fi #Apply Keyboard if [ "$AUTOINSTALL_KEYBOARD" != "gb" ]; then G_DIETPI-NOTIFY 2 "Setting Keyboard $AUTOINSTALL_KEYBOARD. Please wait...\n" sed -i '/XKBLAYOUT=/c XKBLAYOUT="'"$AUTOINSTALL_KEYBOARD"'"' /etc/default/keyboard #systemctl restart keyboard-setup fi #Apply & Mount Network drives if installed if (( ${aSOFTWARE_INSTALL_STATE[1]} == 2 )); then /DietPi/dietpi/func/dietpi-set_smbclient 1 fi if (( ${aSOFTWARE_INSTALL_STATE[2]} == 2 )); then /DietPi/dietpi/func/dietpi-set_curlftpfs 1 fi #Custom 1st run Script (Local file) local run_custom_script=0 if [ -f /boot/Automation_Custom_Script.sh ]; then INSTALL_DESCRIPTION='Automation - Local Custom Script' Banner_Installing cp /boot/Automation_Custom_Script.sh /root/AUTO_CustomScript.sh run_custom_script=1 #Custom 1st run Script (Online file) elif [ "$AUTOINSTALL_CUSTOMSCRIPTURL" != "0" ]; then INSTALL_DESCRIPTION='Automation - Online Custom Script' Banner_Installing INSTALL_URL_ADDRESS=$AUTOINSTALL_CUSTOMSCRIPTURL G_CHECK_URL "$INSTALL_URL_ADDRESS" #Install if (( $? == 0 )); then #Get script and execute wget "$INSTALL_URL_ADDRESS" -O /root/AUTO_CustomScript.sh run_custom_script=1 else echo -e "Automated Custom Script URL Error:\n $AUTOINSTALL_CUSTOMSCRIPTURL is offline and/or unreachable" >> "$FP_DIETPIAUTOMATION_LOG" fi fi if (( $run_custom_script )); then chmod +x /root/AUTO_CustomScript.sh /root/AUTO_CustomScript.sh local result=$? if (( $result == 0 )); then echo -e "Automated custom script executed succesfully:\n - Filepath = /root/AUTO_CustomScript.sh\n - URL = $AUTOINSTALL_CUSTOMSCRIPTURL" >> "$FP_DIETPIAUTOMATION_LOG" else echo -e "Automated Custom Script Error:\n - Exit code = $result\n - Filepath = /root/AUTO_CustomScript.sh\n - URL = $AUTOINSTALL_CUSTOMSCRIPTURL" >> "$FP_DIETPIAUTOMATION_LOG" fi fi #Apply AutoStart /DietPi/dietpi/dietpi-autostart $AUTOINSTALL_AUTOSTARTTARGET fi #Set Install Stage to Finished echo 1 > /DietPi/dietpi/.install_stage } #///////////////////////////////////////////////////////////////////////////////////// # First Run / Automation functions Vars (eg: on a fresh install) #///////////////////////////////////////////////////////////////////////////////////// AUTOINSTALL_ENABLED=0 AUTOINSTALL_SSHINDEX=0 AUTOINSTALL_FILESERVERINDEX=0 AUTOINSTALL_LOGGINGINDEX=0 AUTOINSTALL_WEBSERVERINDEX=0 AUTOINSTALL_AUTOSTARTTARGET=0 AUTOINSTALL_TIMEZONE=0 AUTOINSTALL_LANGUAGE=0 AUTOINSTALL_KEYBOARD=0 AUTOINSTALL_CUSTOMSCRIPTURL=0 FirstRun_Automation_Init(){ #Get settings AUTOINSTALL_ENABLED=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_AUTOMATED=' | sed 's/.*=//') AUTOINSTALL_AUTOSTARTTARGET=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_AUTOSTART_TARGET_INDEX=' | sed 's/.*=//' ) AUTOINSTALL_SSHINDEX=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_SSH_SERVER_INDEX=' | sed 's/.*=//') AUTOINSTALL_FILESERVERINDEX=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_FILE_SERVER_INDEX=' | sed 's/.*=//') AUTOINSTALL_LOGGINGINDEX=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_LOGGING_INDEX=' | sed 's/.*=//') AUTOINSTALL_WEBSERVERINDEX=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_WEB_SERVER_INDEX=' | sed 's/.*=//') AUTOINSTALL_TIMEZONE=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_TIMEZONE=' | sed 's/.*=//' ) AUTOINSTALL_LANGUAGE=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_LOCALE=' | sed 's/.*=//' ) AUTOINSTALL_KEYBOARD=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_KEYBOARD_LAYOUT=' | sed 's/.*=//' ) AUTOINSTALL_CUSTOMSCRIPTURL=$(cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_CUSTOM_SCRIPT_EXEC=' | sed 's/AUTO_SETUP_CUSTOM_SCRIPT_EXEC=//') } FirstRun_Automation_Set(){ #Automated install if (( $AUTOINSTALL_ENABLED >= 1 )); then G_DIETPI-NOTIFY 3 DietPi-Software "Running automated installation" #Skip dietpi-software menu TARGETMENUID=-1 #Set start install GOSTARTINSTALL=1 #Find all software entires of AUTO_SETUP_INSTALL_SOFTWARE_ID= in dietpi.txt. Then set to state 1 for installation. while read -r line do local index=$( echo -e "$line" | grep '^AUTO_SETUP_INSTALL_SOFTWARE_ID=' | sed 's/[^0-9]*//g' ) # - Flag for installation if [[ $index =~ ^-?[0-9]+$ ]]; then aSOFTWARE_INSTALL_STATE[$index]=1 G_DIETPI-NOTIFY 2 "Automation: ${aSOFTWARE_WHIP_NAME[$index]}. Flagged for installation." fi done < /DietPi/dietpi.txt fi #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 # - IPversion preference: https://github.com/Fourdee/DietPi/issues/472 /DietPi/dietpi/func/dietpi-set_hardware preferipversion "$(cat /DietPi/dietpi.txt | grep -m1 '^CONFIG_PREFER_IPVERSION=' | sed 's/.*=//')" } FirstRun_DietPi_Update(){ #Disable powersaving on main screen setterm -blank 0 -powersave off 2> /dev/null #-1 = 1st run | 0 = Reboot, updates applied | 1 = Idle, No updates #Update .update_stage file to completed echo 1 > /DietPi/dietpi/.update_stage #Update APT G_AGUP #Check for updates and apply if needed (1=force apply updates). /DietPi/dietpi/dietpi-update 1 #Check update stage file again (dietpi-update will set to 0 if an update was applied and requires a reboot) if (( $(cat /DietPi/dietpi/.update_stage) == 0 )); then #Update .update_stage file to completed echo 1 > /DietPi/dietpi/.update_stage #Prompt user for reboot if (( $G_USER_INPUTS )); then WHIP_TITLE='DietPi Update Completed' whiptail --title "$WHIP_TITLE" --msgbox "DietPi has been updated to the latest version.\nYour system will now reboot. Once completed, simply login to resume DietPi Setup. \n\nPress Enter to Continue." 13 65 fi #Reboot required NOW reboot Exit_Destroy fi } #///////////////////////////////////////////////////////////////////////////////////// # Internet Connection Test Vars #///////////////////////////////////////////////////////////////////////////////////// #Use /etc/apt/sources.list for connection test INTERNET_URL_TEST=$(grep -m1 'deb ' /etc/apt/sources.list | awk '{print $2}') Check_Internet_Connection(){ G_CHECK_URL "$INTERNET_URL_TEST" #will exit on failure here } #///////////////////////////////////////////////////////////////////////////////////// # Globals #///////////////////////////////////////////////////////////////////////////////////// Input_Modes(){ # - Skip menu TARGETMENUID=-1 DISABLE_REBOOT=1 local ainput=("$@") #Install software and exit. if [ "$1" = "install" ] || [ "$1" = "reinstall" ] || [ "$1" = "uninstall" ] ; then G_DIETPI-NOTIFY 3 DietPi-Software "Automated $1" sleep 1 # - Make sure we have at least one entry if [ -z "$2" ]; then G_DIETPI-NOTIFY 1 "Please enter a software index ID, or, choice system INDEX_*_TARGET=-?" else # - Uninstall | Stop services prior if [ "$1" = "uninstall" ]; then # - stop services /DietPi/dietpi/dietpi-services stop fi # - Process inputs for i in "${ainput[@]}" do #Valid int means input is unique ID for software index to be installed if [[ $i =~ ^-?[0-9]+$ ]]; then if [ "$1" = "uninstall" ]; then Uninstall_Software "$i" elif [ "$1" = "reinstall" ]; then if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 2 )); then # - We cant uninstall, may remove additional packages. eg: remove Xserver = Remove every Xserver depandant program like Kodi. #Uninstall_Software $i # - So lets flag to be installed aSOFTWARE_INSTALL_STATE[$i]=1 GOSTARTINSTALL=1 G_DIETPI-NOTIFY 0 "Reinstalling ${aSOFTWARE_WHIP_NAME[$i]}: ${aSOFTWARE_WHIP_DESC[$i]}" sleep 1 else G_DIETPI-NOTIFY 2 "$i: ${aSOFTWARE_WHIP_NAME[$i]} is not currently installed" G_DIETPI-NOTIFY 2 "The program must be installed, before reinstall can be used" G_DIETPI-NOTIFY 0 "No changes applied for: ${aSOFTWARE_WHIP_NAME[$i]}" fi elif [ "$1" = "install" ]; then if (( ${aSOFTWARE_INSTALL_STATE[$i]} != 2 )); then aSOFTWARE_INSTALL_STATE[$i]=1 GOSTARTINSTALL=1 G_DIETPI-NOTIFY 0 "Installing ${aSOFTWARE_WHIP_NAME[$i]}: ${aSOFTWARE_WHIP_DESC[$i]}" sleep 0.5 else G_DIETPI-NOTIFY 2 "$i: ${aSOFTWARE_WHIP_NAME[$i]} is already installed" G_DIETPI-NOTIFY 0 "No changes applied for: ${aSOFTWARE_WHIP_NAME[$i]}" fi fi fi done # - Uninstall | Finish up and clear non-required packages if [ "$1" = "uninstall" ]; then Uninstall_Software_Finalize #Save Write_InstallFileList # - Start services /DietPi/dietpi/dietpi-services start fi fi #Apply permissions elif [ "$1" = "setpermissions" ]; then Install_Apply_Permissions &> /dev/null G_DIETPI-NOTIFY 0 "Set permissions completed" #List unique software names and ID's elif [ "$1" = "list" ]; then for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do local string='' if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 2 )); then string="\e[32mID $i | " else string="\e[0mID $i | " fi string+="=${aSOFTWARE_INSTALL_STATE[$i]} | ${aSOFTWARE_WHIP_NAME[$i]}: \e[90m${aSOFTWARE_WHIP_DESC[$i]}\e[0m |" if (( ${aSOFTWARE_REQUIRES_ALSA[$i]} == 1 )); then string+=' +ALSA' fi if (( ${aSOFTWARE_REQUIRES_XSERVERXORG[$i]} == 1 )); then string+=' +XSERVER' fi if (( ${aSOFTWARE_REQUIRES_DESKTOP[$i]} == 1 )); then string+=' +DESKTOP' fi if (( ${aSOFTWARE_REQUIRES_RSYSLOG[$i]} == 1 )); then string+=' +RSYSLOG' fi if (( ${aSOFTWARE_REQUIRES_FFMPEG[$i]} == 1 )); then string+=' +FFMPEG' fi if (( ${aSOFTWARE_REQUIRES_ORACLEJAVA[$i]} == 1 )); then string+=' +ORACLEJAVA' fi if (( ${aSOFTWARE_REQUIRES_NODEJS[$i]} == 1 )); then string+=' +NODEJS' fi if (( ${aSOFTWARE_REQUIRES_BUILDESSENTIAL[$i]} == 1 )); then string+=' +BUILDESSENTIAL' fi if (( ${aSOFTWARE_REQUIRES_GIT[$i]} == 1 )); then string+=' +GIT' fi if (( ${aSOFTWARE_REQUIRES_WEBSERVER[$i]} == 1 )); then string+=' +WEBSERVER' fi if (( ${aSOFTWARE_REQUIRES_MYSQL[$i]} == 1 )); then string+=' +MYSQL' fi if (( ${aSOFTWARE_REQUIRES_SQLITE[$i]} == 1 )); then string+=' +SQLITE' fi # - Available for G_HW_ARCH? if (( ! ${aSOFTWARE_AVAIL_G_HW_ARCH[$i,$G_HW_ARCH]} )); then string+=" \e[31mDISABLED for G_HW_ARCH\e[0m" fi # - Available for G_HW_MODEL? if (( ! ${aSOFTWARE_AVAIL_G_HW_MODEL[$i,$G_HW_MODEL]} )); then string+=" \e[31mDISABLED for G_HW_MODEL\e[0m" fi # - Online docs if [ -n "${aSOFTWARE_ONLINEDOC_URL[$i]}" ]; then string+=" | \e[90m$FP_ONLINEDOC_URL${aSOFTWARE_ONLINEDOC_URL[$i]}\e[0m" fi #Convert string to lowercase (easier to | grep stuff) echo -e "${string,,}" #Much faster than echo -e $(echo -e "$string" | tr '[:upper:]' '[:lower:]') done echo -e "Total Software index HARD limit : $TOTAL_SOFTWARE_INDEXS_HARDLIMIT" echo -e "Total Software index Current : $TOTAL_SOFTWARE_INDEXS" #List unique software names and ID's elif [ "$1" = "weblist_export" ]; then local fp_export_dir='/tmp/dietpi-software/weblist_export' rm -R "$fp_export_dir" mkdir -p "$fp_export_dir" # - Category desc | Remove '─' before saving. local fp_target="$fp_export_dir/category_dietpi_total" echo -e "$MAX_SOFTWARE_CATEGORIES_DIETPI" > "$fp_target" local fp_target="$fp_export_dir/category_linux_total" echo -e "$MAX_SOFTWARE_CATEGORIES_LINUX" > "$fp_target" fp_target="$fp_export_dir/category_dietpi_desc" for ((i=0; i<$MAX_SOFTWARE_CATEGORIES_DIETPI; i++)) do local output= echo -e "$( echo ${aSOFTWARE_CATEGORIES_DIETPI[$i]} | sed 's/─//g')" >> "$fp_target" done fp_target="$fp_export_dir/category_linux_desc" for ((i=0; i<$MAX_SOFTWARE_CATEGORIES_LINUX; i++)) do echo -e "$( echo ${aSOFTWARE_CATEGORIES_LINUX[$i]} | sed 's/─//g')" >> "$fp_target" done # - Software list local fp_target="$fp_export_dir/total_software_index" echo -e "$TOTAL_SOFTWARE_INDEXS" > "$fp_target" fp_target="$fp_export_dir/software_installed_state" printf "%i\n" "${aSOFTWARE_INSTALL_STATE[@]}" > "$fp_target" fp_target="$fp_export_dir/software_name" printf "%s\n" "${aSOFTWARE_WHIP_NAME[@]}" > "$fp_target" fp_target="$fp_export_dir/software_desc" printf "%s\n" "${aSOFTWARE_WHIP_DESC[@]}" > "$fp_target" fp_target="$fp_export_dir/category_index" printf "%i\n" "${aSOFTWARE_CATEGORY_INDEX[@]}" > "$fp_target" fp_target="$fp_export_dir/software_urldocs" printf "%s\n" "${aSOFTWARE_ONLINEDOC_URL[@]}" > "$fp_target" # - Available for device? fp_target="$fp_export_dir/software_available_hw_model" for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do printf "%i\n" "${aSOFTWARE_AVAIL_G_HW_MODEL[$i,$G_HW_MODEL]}" >> "$fp_target" done fp_target="$fp_export_dir/software_available_hw_arch" for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do printf "%i\n" "${aSOFTWARE_AVAIL_G_HW_ARCH[$i,$G_HW_ARCH]}" >> "$fp_target" done # - Flagged Prereqs for installation # fp_target="$fp_export_dir/installs_alsa" # printf "%s\n" "${aSOFTWARE_REQUIRES_ALSA[@]}" > "$fp_target" # fp_target="$fp_export_dir/installs_xserver" # printf "%s\n" "${aSOFTWARE_REQUIRES_XSERVERXORG[@]}" > "$fp_target" # fp_target="$fp_export_dir/installs_desktop" # printf "%s\n" "${aSOFTWARE_REQUIRES_DESKTOP[@]}" > "$fp_target" else G_DIETPI-NOTIFY 2 "Unknown command $1" fi unset ainput } Exit_Destroy(){ Software_Arrays_Destroy exit } #///////////////////////////////////////////////////////////////////////////////////// # Error Functions #///////////////////////////////////////////////////////////////////////////////////// ERROR_TEXT="" Error_Display(){ #Automation | Save to logfile if (( $G_USER_INPUTS )); then whiptail --title "Error" --msgbox "$ERROR_TEXT" 18 70 else echo -e "Error: $ERROR_TEXT" >> "$FP_DIETPIAUTOMATION_LOG" fi } #///////////////////////////////////////////////////////////////////////////////////// # Whip menus #///////////////////////////////////////////////////////////////////////////////////// WHIP_BACKTITLE='DietPi-Software' WHIP_TITLE=0 WHIP_QUESTION=0 MENU_MAIN_LASTITEM='Help!' TARGETMENUID=0 Menu_CreateSoftwareList(){ #software type for this menu local software_type=$1 #0=dietpi 1=linux local max_categories=$MAX_SOFTWARE_CATEGORIES_DIETPI if (( $1 == 1 )); then max_categories=$MAX_SOFTWARE_CATEGORIES_LINUX fi #----------------------------------------------------------------------------- #Generate Whiptail menu list based on category local whiptail_list=() for ((i=0; i<$max_categories; i++)) do #Only add the category if we have software for it. local category_enabled=0 #Now run through all available software for ((j=0; j<$TOTAL_SOFTWARE_INDEXS; j++)) do #Check if this software matches the current category and sofware type for this menu. # - I originally had "aSOFTWARE_AVAIL_G_HW_MODEL" and "aSOFTWARE_AVAIL_G_HW_ARCH" in one 'if' statement below, however, this seems to takes 4x longer to process in bash. if (( ${aSOFTWARE_CATEGORY_INDEX[$j]} == $i && ${aSOFTWARE_TYPE[$j]} == $software_type )); then # + is available for hardware? # + is available for distro? if (( ${aSOFTWARE_AVAIL_G_HW_MODEL[$j,$G_HW_MODEL]} && ${aSOFTWARE_AVAIL_G_HW_ARCH[$j,$G_HW_ARCH]} )); then local selected="off" if (( ${aSOFTWARE_INSTALL_STATE[$j]} > 0 )); then selected="on" if (( ${aSOFTWARE_INSTALL_STATE[$j]} == 1 )); then #Reset to 0. Menu checklists will apply back to 1 aSOFTWARE_INSTALL_STATE[$j]=0 fi fi #Add category if (( $category_enabled == 0 )); then # - dietpi if (( $1 == 0 )); then whiptail_list+=("" "${aSOFTWARE_CATEGORIES_DIETPI[$i]}" "off") # - linux elif (( $1 == 1 )); then whiptail_list+=("" "${aSOFTWARE_CATEGORIES_LINUX[$i]}" "off") fi category_enabled=1 fi #Add this option to whiptail list whiptail_list+=("$j" "${aSOFTWARE_WHIP_NAME[$j]}: ${aSOFTWARE_WHIP_DESC[$j]}" "$selected") fi fi done done #----------------------------------------------------------------------------- WHIP_TITLE='DietPi Software Selection' whiptail --title "$WHIP_TITLE" --checklist --separate-output "Please use the spacebar to select the software you wish to install.\nSoftware details: http://dietpi.com/software" --backtitle "$WHIP_BACKTITLE" 22 78 14 "${whiptail_list[@]}" 2>/tmp/dietpi-software_results #delete[] unset whiptail_list #Reset Choices made flag # - dietpi if (( $1 == 0 )); then INSTALL_DIETPI_CHOICESMADE=0 # - linux elif (( $1 == 1 )); then INSTALL_LINUX_CHOICESMADE=0 fi #Check for matching results (selected items) while read choice do for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do #enable if (( $choice == $i && ${aSOFTWARE_INSTALL_STATE[$i]} == 0 )); then # - dietpi if (( $1 == 0 )); then INSTALL_DIETPI_CHOICESMADE=1 # - linux elif (( $1 == 1 )); then INSTALL_LINUX_CHOICESMADE=1 fi aSOFTWARE_INSTALL_STATE[$i]=1 break fi done done < /tmp/dietpi-software_results rm /tmp/dietpi-software_results &> /dev/null } Menu_Main(){ #Data for storing SSH server index info local index_sshserver_text="None" if (( $INDEX_SSHSERVER_TARGET == -1 )); then index_sshserver_text="Dropbear" elif (( $INDEX_SSHSERVER_TARGET == -2 )); then index_sshserver_text="OpenSSH" fi #Data for storing Fileserver index info local index_fileserver_text="None" if (( $INDEX_FILESERVER_TARGET == -1 )); then index_fileserver_text="ProFTP" elif (( $INDEX_FILESERVER_TARGET == -2 )); then index_fileserver_text="Samba" fi #Data for storing Logging index info local index_logging_text="None" if (( $INDEX_LOGGING_TARGET == -1 )); then index_logging_text="DietPi-Ramlog #1" elif (( $INDEX_LOGGING_TARGET == -2 )); then index_logging_text="DietPi-Ramlog #2" elif (( $INDEX_LOGGING_TARGET == -3 )); then index_logging_text="Full" fi #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_USB_Drive_Installed #Where is userdata stored? local user_data_location_current=$(readlink -f $G_FP_DIETPI_USERDATA) local user_data_location_description='' if [ "$user_data_location_current" = "$FP_DIETPI_DEDICATED_USBDRIVE" ]; then user_data_location_description="USB Drive | $user_data_location_current" elif [ "$user_data_location_current" = "$G_FP_DIETPI_USERDATA" ]; then user_data_location_description="SD/EMMC | $user_data_location_current" else user_data_location_description="Custom | $user_data_location_current" fi # - Webserver preference system local index_webserver_text='Apache2' if (( $INDEX_WEBSERVER_TARGET == -1 )); then index_webserver_text='Nginx' elif (( $INDEX_WEBSERVER_TARGET == -2 )); then index_webserver_text='Lighttpd' fi WHIP_TITLE='DietPi-Software' WHIP_BACKTITLE="DietPi-Software | IP: $(sed -n 4p /DietPi/dietpi/.network) | Device: $G_HW_MODEL_DESCRIPTION" OPTION=$(whiptail --title "$WHIP_TITLE" --backtitle "$WHIP_BACKTITLE" --menu "" --default-item "$MENU_MAIN_LASTITEM" --cancel-button "Exit" 20 100 13 \ "Help!" "Links to online guides, docs and information" \ "DietPi-Config" "Feature-rich configuration tool for your device" \ "" "─── Select Software ─────────────────────────" \ "Software Optimized" "Select DietPi optimized software for installation" \ "Software Additional" "Select additional Linux software for installation" \ "SSH Server" ": $index_sshserver_text" \ "File Server" ": $index_fileserver_text" \ "Log System" ": $index_logging_text" \ "Webserver Preference" ": $index_webserver_text" \ "User Data Location" ": $user_data_location_description" \ "" "─── Install or Remove Software ──────────────" \ "Uninstall" "Select installed software for removal" \ "Install" "Go >> Start installation for selected software" 3>&1 1>&2 2>&3) CHOICE=$? if (( $CHOICE == 0 )); then MENU_MAIN_LASTITEM="$OPTION" case "$OPTION" in "Uninstall") TARGETMENUID=3 ;; "Software Optimized") TARGETMENUID=1 ;; "Software Additional"*) TARGETMENUID=2 ;; "SSH Server") WHIP_TITLE='SSH Server Choices' OPTION=$(whiptail --title "$WHIP_TITLE" --menu "> None\nSelecting this option will uninstall all SSH servers. This reduces system resources and improves performance. Useful for users who do NOT require networked/remote terminal access.\n\n> Dropbear (Recommended)\nLightweight SSH server, installed by default on DietPi systems.\n\n> OpenSSH\nA feature rich SSH server with SFTP/SCP support, at the cost of increased resource usage." --cancel-button "Back" --default-item "$index_sshserver_text" 21 75 3 \ "None" "Not required / manual setup." \ "Dropbear" "Lightweight SSH Server (Recommended)." \ "OpenSSH" "Feature Rich SSH Server with SFTP/SCP support." 3>&1 1>&2 2>&3) #Assign target index if [ "$OPTION" = "None" ]; then INDEX_SSHSERVER_TARGET=0 toberemoved_text="Dropbear and OpenSSH Server" elif [ "$OPTION" = "Dropbear" ]; then INDEX_SSHSERVER_TARGET=-1 toberemoved_text="OpenSSH Server" elif [ "$OPTION" = "OpenSSH" ]; then INDEX_SSHSERVER_TARGET=-2 toberemoved_text="Dropbear" #Reset to current else INDEX_SSHSERVER_TARGET=$INDEX_SSHSERVER_CURRENT fi #Check for changes INSTALL_SSHSERVER_CHOICESMADE=0 if (( $INDEX_SSHSERVER_TARGET != $INDEX_SSHSERVER_CURRENT )); then INSTALL_SSHSERVER_CHOICESMADE=1 #Inform user WHIP_TITLE="SSH Server Change" WHIP_QUESTION="$OPTION has been selected:\n- Your choice will be applied when 'Install Go >> Start installation' is selected.\n- $toberemoved_text installations will be automatically uninstalled." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 11 75 fi ;; "File Server") WHIP_TITLE='Fileserver Choices' OPTION=$(whiptail --title "$WHIP_TITLE" --menu "> None\nSelect this option if you do NOT require a method of accessing files and folders on this device, over a network.\n\n> ProFTP (Recommended for RPi v1)\nAllows you to access/share files on this device efficiently with minimal cpu usage. Uses FTP protocol.\n\n> Samba (Recommended for RPi v2)\nAllows you to easily access/share files on this device, at the cost of higher cpu usage.\n\nMore info: http://dietpi.com/phpbb/viewtopic.php?f=8&t=15#p19" --cancel-button "Back" --default-item "$index_fileserver_text" 23 75 3 \ "None" "Not required / manual setup." \ "ProFTP" "Efficient, lightweight fileserver (recommended)." \ "Samba" "Feature-rich fileserver." 3>&1 1>&2 2>&3) #Assign target index if [ "$OPTION" = "None" ]; then INDEX_FILESERVER_TARGET=0 toberemoved_text="ProFTP and Samba Server" elif [ "$OPTION" = "ProFTP" ]; then INDEX_FILESERVER_TARGET=-1 toberemoved_text="Samba Server" elif [ "$OPTION" = "Samba" ]; then INDEX_FILESERVER_TARGET=-2 toberemoved_text="ProFTP" #Reset to current else INDEX_FILESERVER_TARGET=$INDEX_FILESERVER_CURRENT fi #Check for changes INSTALL_FILESERVER_CHOICESMADE=0 if (( $INDEX_FILESERVER_TARGET != $INDEX_FILESERVER_CURRENT )); then INSTALL_FILESERVER_CHOICESMADE=1 #Inform user WHIP_TITLE="Fileserver Choice Change" WHIP_QUESTION="$OPTION has been selected:\n- Your choice will be applied when 'Install Go >> Start installation' is selected.\n- $toberemoved_text installations will be automatically uninstalled." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 11 75 fi ;; "Log System") WHIP_TITLE='Logging System Choices' OPTION=$(whiptail --title "$WHIP_TITLE" --menu "> None\nSelecting this option will uninstall DietPi-Ramlog, Logrotate, Rsyslog.\n\n> DietPi-Ramlog #1 (Max performance)\nMounts /var/log to RAM, reducing filesystem IO. Logfiles are cleared every hour. Does NOT save logfiles to disk.\n\n> DietPi-Ramlog #2\nSame as #1, with the added feature of saving logfile contents to disk ($HOME/logfile_storage/*), before being cleared.\n\n> Full (Reduces performance)\nMounts /var/log to DISK, reduces SDcard lifespan. Full logging system with Logrotate and Rsyslog." --cancel-button "Back" --default-item "$index_logging_text" 25 75 4 \ "None" " Not required / manual setup." \ "DietPi-Ramlog #1" " Hourly clear (recommended)." \ "DietPi-Ramlog #2" " Hourly save, then clear." \ "Full" " Logrotate and Rsyslog." 3>&1 1>&2 2>&3) #Assign target index if [ "$OPTION" = "None" ]; then INDEX_LOGGING_TARGET=0 toberemoved_text="DietPi-Ramlog, Logrotate, Rsyslog" elif [ "$OPTION" = "DietPi-Ramlog #1" ]; then INDEX_LOGGING_TARGET=-1 toberemoved_text="Logrotate, Rsyslog" elif [ "$OPTION" = "DietPi-Ramlog #2" ]; then INDEX_LOGGING_TARGET=-2 toberemoved_text="Logrotate, Rsyslog" elif [ "$OPTION" = "Full" ]; then INDEX_LOGGING_TARGET=-3 toberemoved_text="DietPi-Ramlog" #Reset to current else INDEX_LOGGING_TARGET=$INDEX_LOGGING_CURRENT fi #Check for changes INSTALL_LOGGING_CHOICESMADE=0 if (( $INDEX_LOGGING_TARGET != $INDEX_LOGGING_CURRENT )); then INSTALL_LOGGING_CHOICESMADE=1 #Inform user WHIP_TITLE="Logging System Change" WHIP_QUESTION="$OPTION has been selected:\n- Your choice will be applied when 'Install Go >> Start installation' is selected.\n- $toberemoved_text installations will be automatically uninstalled." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 11 75 fi ;; "User Data Location") WHIP_TITLE='User Data Location' # - Vars if we need to move data. local move_data_target=$user_data_location_current OPTION=$(whiptail --title "$WHIP_TITLE" --menu "Choose where to store your user data. User data includes software such as Owncloud data store, BitTorrent downloads etc\n\nMore information on user data in DietPi:\n - http://dietpi.com/phpbb/viewtopic.php?f=8&t=478&p=2087\n\n> DietPi-Drive Manager\nLaunch DietPi-Drive Manager to setup external drives, and, move user data to different locations." --cancel-button "Back" 20 85 3 \ "Drive Manager" "Launches DietPi-Drive Manager" \ "List" "Select from a list of available mounts/drives, to move user data" \ "Custom" "Input a manual location to move user data" 3>&1 1>&2 2>&3) CHOICE=$? if (( $CHOICE == 0 )); then # - DriveMan if [ "$OPTION" = "Drive Manager" ]; then /DietPi/dietpi/dietpi-drive_manager # - List elif [ "$OPTION" = "List" ]; then /DietPi/dietpi/dietpi-drive_manager 1 local return_value="$(cat /tmp/dietpi-drive_manager_selmnt)" if [ -n "$return_value" ]; then if [ "$return_value" = "/" ]; then return_value='/mnt' fi move_data_target="$return_value" move_data_target+='/dietpi_userdata' fi # - Manual filepath entry elif [ "$OPTION" = "Custom" ]; then OPTION=$(whiptail --inputbox "Please input a location. Your user data will be stored inside this location.\n - eg: /mnt/MyDrive/MyData" 11 60 "$user_data_location_current" --title "User/Personal Data Directory" --backtitle "$WHIP_BACKTITLE" 3>&1 1>&2 2>&3) CHOICE=$? if (( $CHOICE == 0 )); then move_data_target=$OPTION fi fi # - Move data if the new entry has changed if [ "$user_data_location_current" != "$move_data_target" ]; then # - Ask before we begin whiptail --title "User data transfer" --yesno "DietPi will now attempt to transfer your existing user data to the new location:\n\n - From: $user_data_location_current\n - To: $move_data_target\n\nWould you like to begin?" --backtitle "$WHIP_BACKTITLE" --defaultno 14 70 CHOICE=$? if (( $CHOICE == 0 )); then # - Move data, setup symlinks /DietPi/dietpi/func/dietpi-set_userdata "$user_data_location_current" "$move_data_target" if (( $? == 0 )); then whiptail --title "User data transfer: Completed" --msgbox "Your user data has been sucessfuly moved:\n\n - From: $user_data_location_current\n - To: $move_data_target" 12 70 else whiptail --title "User data transfer: Failed" --msgbox "$(cat /var/log/dietpi-move_userdata.log)\nNo changes have been applied." 12 70 fi fi fi fi ;; "Webserver Preference") WHIP_TITLE='Webserver Preference' OPTION=$(whiptail --title "$WHIP_TITLE" --menu "More Info: http://dietpi.com/phpbb/viewtopic.php?f=8&t=5&p=1549#p1549\n\n> Apache2\nFeature-rich and popular. Recommended for beginners and users who are looking to follow Apache2 based guides.\n\n> Nginx\nLightweight alternative to Apache2. Nginx claims faster webserver performance compared to Apache2.\n\n> Lighttpd\nExtremely lightweight and is generally considered to offer the \"best\" webserver performance for SBC's. Recommended for users who expect low webserver traffic." --cancel-button "Back" --default-item "$index_webserver_text" 24 75 3 \ "Apache2" "Popular webserver." \ "Nginx" "Lightweight webserver." \ "Lighttpd" "Extremely lightweight webserver." 3>&1 1>&2 2>&3) #Assign target index if [ "$OPTION" = "Apache2" ]; then INDEX_WEBSERVER_TARGET=0 elif [ "$OPTION" = "Nginx" ]; then INDEX_WEBSERVER_TARGET=-1 elif [ "$OPTION" = "Lighttpd" ]; then INDEX_WEBSERVER_TARGET=-2 #Reset to current else INDEX_WEBSERVER_TARGET=$INDEX_WEBSERVER_CURRENT fi #Check for changes if (( $INDEX_WEBSERVER_TARGET != $INDEX_WEBSERVER_CURRENT )); then # - Check for existing and compatible installed stacks before allowing the change local incompatible_webserver_preference=0 local info_currently_installed_webserver='None' if (( $(dpkg -l | awk '{print $2}' | grep -ci -m1 'apache2'))); then INDEX_WEBSERVER_CURRENT=0 info_currently_installed_webserver='Apache2' if (( $INDEX_WEBSERVER_TARGET != 0 )); then incompatible_webserver_preference=1 fi elif (( $(dpkg -l | awk '{print $2}' | grep -ci -m1 'nginx') )); then INDEX_WEBSERVER_CURRENT=-1 info_currently_installed_webserver='Nginx' if (( $INDEX_WEBSERVER_TARGET != -1 )); then incompatible_webserver_preference=1 fi elif (( $(dpkg -l | awk '{print $2}' | grep -ci -m1 'lighttpd') )); then INDEX_WEBSERVER_CURRENT=-2 info_currently_installed_webserver='Lighttpd' if (( $INDEX_WEBSERVER_TARGET != -2 )); then incompatible_webserver_preference=1 fi fi # - Reset preference selection if (( $incompatible_webserver_preference == 1 )); then INDEX_WEBSERVER_TARGET=$INDEX_WEBSERVER_CURRENT # - inform user WHIP_TITLE="Error: Incompatible Webserver Preference" WHIP_QUESTION="Unable to change your webserver preference to $OPTION.\n\nThis 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." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 11 75 # - Apply preference selection else # - Inform user WHIP_TITLE="Webserver Preference Changed" WHIP_QUESTION="$OPTION has been selected as your webserver preference.\n\nWhen you select any software for install that requires a webserver, DietPi will automatically install your prefered choice ($OPTION)." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 11 75 # - NB: INDEX_WEBSERVER_CURRENT=$INDEX_WEBSERVER_TARGET | is applied during installation with func Apply_Webserver_Preference(). fi fi ;; "DietPi-Config") /DietPi/dietpi/dietpi-config ;; "Help!") #Populate help to text file so we can read it back to whiptail, as a scrollbox. cat << _EOF_ > /tmp/dietpi-software_help_onlinedoc_url_list ─────────────────────────────────────────────────────────────── Welcome to DietPi: ─────────────────────────────────────────────────────────────── Use PageUp/Down or Arrow Up/Down to scroll this help screen. Press ESC, or TAB then enter to exit this help screen. Easy to follow, step by step guides for installing DietPi: http://dietpi.com/phpbb/viewtopic.php?f=8&t=9 For a list of all installation options and their details: http://dietpi.com/software ─────────────────────────────────────────────────────────────── List of installed software and their URL links for online docs: ─────────────────────────────────────────────────────────────── _EOF_ # - Installed software for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_INSTALL_STATE[$i]} > 0 )); then if [ -n "${aSOFTWARE_ONLINEDOC_URL[$i]}" ]; then cat << _EOF_ >> /tmp/dietpi-software_help_onlinedoc_url_list ${aSOFTWARE_WHIP_NAME[$i]}: ${aSOFTWARE_WHIP_NAME[$i]} $FP_ONLINEDOC_URL${aSOFTWARE_ONLINEDOC_URL[$i]} _EOF_ fi fi done whiptail --title "DietPi - Help" --backtitle "$WHIP_BACKTITLE" --textbox /tmp/dietpi-software_help_onlinedoc_url_list $(( $(tput lines) - 3 )) $(( $(tput cols) - 3 )) --scrolltext ;; Install) Menu_StartInstall ;; esac #Exit/Abort Setup else Menu_Exit fi } Menu_Exit(){ #1st run install if (( $G_DIETPI_INSTALL_STAGE == 0 )); then WHIP_TITLE='Exit Setup?' WHIP_QUESTION=' DietPi has not fully been installed.\n This must be completed prior to using DietPi by selecting:\n - Go Start Install. \n \n Would you like to exit and abort the installation?' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" --yes-button "Ok" --no-button "Back" --defaultno 13 65 CHOICE=$? if (( $CHOICE == 0 )); then Banner_Aborted #Exit script NOW Exit_Destroy else #Return to Main Menu TARGETMENUID=0 fi #Standard exit elif (( $G_DIETPI_INSTALL_STAGE == 1 )); then WHIP_TITLE='Exit DietPi-Software?' WHIP_QUESTION='Do you wish to exit DietPi-Software?\n\nAll changes to software selections will be cleared.' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" --yes-button "Ok" --no-button "Back" --defaultno 11 65 CHOICE=$? if (( $CHOICE == 0 )); then Banner_Aborted #Exit script NOW Exit_Destroy else #Return to Main Menu TARGETMENUID=0 fi fi } Menu_ConfirmInstall(){ #Obtain list of pending software installation: local string_output='' for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then string_output+="\n - ${aSOFTWARE_WHIP_NAME[$i]}: ${aSOFTWARE_WHIP_DESC[$i]}" fi done #Confirm Software install WHIP_TITLE='DietPi - Start Installation?' WHIP_QUESTION="DietPi is now ready to install your software choices: $string_output\n\nSoftware details, usernames, passwords etc:\n - http://dietpi.com/software\n\nWould you like to begin?" whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --yes-button "Ok" --no-button "Back" --defaultno --backtitle "$WHIP_BACKTITLE" 20 70 CHOICE=$? if (( $CHOICE == 0 )); then #exit menu system TARGETMENUID=-1 #Enable installation start flag GOSTARTINSTALL=1 else #Return to Main Menu TARGETMENUID=0 fi } Menu_StartInstall(){ #Check if the user has made changes to their software selections. if (( $INSTALL_DIETPI_CHOICESMADE || $INSTALL_LINUX_CHOICESMADE || $INSTALL_SSHSERVER_CHOICESMADE || $INSTALL_FILESERVER_CHOICESMADE || $INSTALL_LOGGING_CHOICESMADE )); then # Confirm install with user Menu_ConfirmInstall else #1st run install if (( $G_DIETPI_INSTALL_STAGE == 0 )); then WHIP_TITLE='No Software Selected. Continue?' WHIP_QUESTION='DietPi was unable to detect any software selections for install. Do you wish to continue?\n\nBy selecting Ok: \n- DietPi optimized software will NOT be installed.\nYou can use dietpi-software at a later date if you change your mind. \n\n- You want a Minimal Raspbian/Debian Server Install.\nDietPi is a minimal image. A great OS base to use with your projects.' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" --yes-button "Ok" --no-button "Back" --defaultno 16 75 CHOICE=$? if (( $CHOICE == 0 )); then #exit menu system TARGETMENUID=-1 #Enable installation start flag GOSTARTINSTALL=1 else #Return to Main Menu TARGETMENUID=0 fi #Not 1st run elif (( $G_DIETPI_INSTALL_STAGE == 1 )); then WHIP_TITLE='No Changes to Software Selection' whiptail --title "$WHIP_TITLE" --msgbox "No changes have been detected. Unable to start installation." 8 65 fi fi } #TARGETMENUID=1 Menu_Dietpi_Software(){ #----------------------------------------------------------------------------- #Generate Whiptail menu and store results into our software arrays Menu_CreateSoftwareList 0 #Return to Main Menu TARGETMENUID=0 #----------------------------------------------------------------------------- #Install Info/Warnings #OMV, .deb package has Nginx as a dependancy. Not compatible with other webservers if (( ${aSOFTWARE_INSTALL_STATE[126]} == 1 && ( ${aSOFTWARE_INSTALL_STATE[77]} == 0 && ${aSOFTWARE_INSTALL_STATE[78]} == 0 && ${aSOFTWARE_INSTALL_STATE[79]} == 0 && $INDEX_WEBSERVER_TARGET != -1 ) )); then WHIP_TITLE='OMV: Requires Nginx' WHIP_QUESTION="Open Media Vault (OMV) requires Nginx webserver and is not compatible with other web servers (eg: Lighttpd/Apache2). This is due to the OMV package listing Nginx as a dependency.\n\nOptions:\n - Change 'web server choice' to 'Nginx'\n - Uninstall current web server, then, select any Nginx web stack for install (eg: LESP)\n\nOpen Media Vault has been deselected and will not be installed." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 19 70 aSOFTWARE_INSTALL_STATE[126]=0 fi #SickRage, setup for Transmission, install it aswell? if (( ${aSOFTWARE_INSTALL_STATE[116]} == 1 && ${aSOFTWARE_INSTALL_STATE[44]} == 0 )); then WHIP_TITLE='SickRage - Install Transmission?' WHIP_QUESTION="The DietPi SickRage installation is pre-configured to work with Transmission BitTorrent Server. This will allow SickRage to automatically download TV shows for you.\n\nNB: If you have another BitTorrent server installed, or prefer manual setup, please select No.\n\nWould you like DietPi to also install Transmission (recommended)?" whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --defaultno --backtitle "$WHIP_BACKTITLE" 14 72 CHOICE=$? if (( $CHOICE == 0 )); then aSOFTWARE_INSTALL_STATE[44]=1 fi fi #Gogs: Requires OpenSSH for ssh-keygen binary: https://github.com/Fourdee/DietPi/issues/442 if (( ${aSOFTWARE_INSTALL_STATE[49]} == 1 && $INDEX_SSHSERVER_TARGET != -2 )); then WHIP_TITLE='Gogs: Requires OpenSSH' WHIP_QUESTION="Gogs requires OpenSSH server to function.\nIf you continue, OpenSSH will be selected for install on your system. OpenSSH will also replace Dropbear (if currently installed).\n\nWould you like to continue with the Gogs installation?" whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --defaultno --backtitle "$WHIP_BACKTITLE" 13 65 CHOICE=$? if (( $CHOICE == 0 )); then # - Use SSH target index to ensure Dropbear gets removed if installed. INDEX_SSHSERVER_TARGET=-2 else aSOFTWARE_INSTALL_STATE[49]=0 fi fi #Webserver stacks for ((i=74; i<=82; i++)) do #Please let DietPi install them for you... if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 1 )); then WHIP_TITLE='Info: Webserver Stack' WHIP_QUESTION="DietPi will automatically install a webserver stack (based on your Webserver Preference) when any software that requires a webserver is selected for installation (eg: Owncloud, PiHole etc).\n\nIt is highly recommended that you allow DietPi to do this for you, ensuring compatibility and stability across DietPi installed programs.\n\nPlease only select a webserver stack if you specifically need it, and, no other webserver stack is installed.\n\nTLDR: You do NOT need to select a webserver stack for installation with DietPi. Its all automatic." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 19 70 break fi done #phpmyadmin + Lighttpd | broken apt-get installation. User must have a fully installed LLM* stack before phpmyadmin can be selected: #https://github.com/Fourdee/DietPi/issues/316#issuecomment-219474664 if (( ${aSOFTWARE_INSTALL_STATE[90]} == 1 && $INDEX_WEBSERVER_TARGET == -2 && ( ${aSOFTWARE_INSTALL_STATE[80]} < 2 && ${aSOFTWARE_INSTALL_STATE[82]} < 2 ) )); then WHIP_TITLE='PhpMyAdmin' WHIP_QUESTION="Due to a apt-get installation issue with PhpMyAdmin, you must have a fully installed Lighttpd + MaridaDB webserver stack, before PhpMyAdmin can be selected for install.\n\nYour selection for PhpMyAdmin has been removed." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 13 70 aSOFTWARE_INSTALL_STATE[90]=0 fi #DietPiCam - warn user of locking out camera: https://github.com/Fourdee/DietPi/issues/249 if (( ${aSOFTWARE_INSTALL_STATE[59]} == 1 )); then WHIP_TITLE='DietPi Cam - Camera' WHIP_QUESTION="DietPi Cam will automatically start and activate the camera during boot. This will prevent other programs (eg: raspistill) from using the camera.\n\nYou can free up the camera by selecting \"Stop Camera\" from the web interface:\nhttp://myip/dietpicam" whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 15 70 fi #EmonHUB/EmonPi if (( ${aSOFTWARE_INSTALL_STATE[99]} == 1 )); then # - Enter API KEY # - Grab key from dietpi.txt USER_EMONHUB_APIKEY_CURRENT=$(cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_EMONHUB_APIKEY=' | sed 's/.*=//') while (( $USER_EMONHUB_APIKEY_COMPLETED == 0 )); do WHIP_TITLE='EmonPi/Hub - API KEY' WHIP_QUESTION="Please enter your \"Write API KEY\":\n - Goto http://emoncms.org and register an account and login.\n - Select \"Setup\" from the top right of screen, then select \"My Account\"\n - Enter the \"Write API Key\" into the box below." OPTION=$(whiptail --inputbox "$WHIP_QUESTION" 14 75 "$USER_EMONHUB_APIKEY_CURRENT" --title "$WHIP_TITLE" --backtitle "$WHIP_BACKTITLE" 3>&1 1>&2 2>&3) CHOICE=$? if (( $CHOICE == 0 )); then USER_EMONHUB_APIKEY_CURRENT=$OPTION WHIP_TITLE='EmonPi/Hub - API KEY' WHIP_QUESTION="The following \"Write API KEY\" will be applied during installation:\n$USER_EMONHUB_APIKEY_CURRENT\n\nIs this key correct?" whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 11 70 CHOICE=$? if (( $CHOICE == 0 )); then # - update dietpi.txt so the value will be applied during installation. sed -i "/^SOFTWARE_EMONHUB_APIKEY=/c\SOFTWARE_EMONHUB_APIKEY=$USER_EMONHUB_APIKEY_CURRENT" /DietPi/dietpi.txt USER_EMONHUB_APIKEY_COMPLETED=1 fi fi done fi #Pi-hole. if (( ${aSOFTWARE_INSTALL_STATE[93]} == 1 )); then # - prompt for static ip. WHIP_TITLE=' Pi-hole - Setup Static IP Now?' WHIP_QUESTION='A static IP address is essential for Pi-hole installations. DietPi-Config can be used to quickly setup your static IP address.\n\nIf you have already setup your static IP, please ignore this message.\n\nWould you like to setup your static IP address now?' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --defaultno --backtitle "$WHIP_BACKTITLE" 15 70 CHOICE=$? if (( $CHOICE == 0 )); then WHIP_TITLE=' Pi-hole - Setup Static IP' WHIP_QUESTION='DietPi-Config will now be launched. Simply select your Ethernet or Wifi connection from the menu to access the IP address settings.\n\nThe "copy current address to STATIC" menu option can be used to quickly setup your static IP. Please ensure you change the mode "DHCP" to "STATIC".\n\nWhen you are done, select "Apply, Save Changes", then exit DietPi-Config to resume setup.' whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 15 70 #Launch DietPi-config networking menu /DietPi/dietpi/dietpi-config 8 1 fi fi #Wifi Hotspot Criteria if (( ${aSOFTWARE_INSTALL_STATE[60]} == 1 )) || (( ${aSOFTWARE_INSTALL_STATE[61]} == 1 )); then #Enable wifi modules /DietPi/dietpi/func/dietpi-set_hardware wifimodules enable local check_criteria=1 while (( $check_criteria == 1 )); do local criteria_passed=1 WHIP_TITLE="WiFi Hotspot Criteria" WHIP_QUESTION="The following criteria must be met for this installation to succeed:" local ethernet_active_state=$(ip r | grep -ci -m1 "eth$(sed -n 1p /DietPi/dietpi/.network)") if (( $ethernet_active_state == 1 )); then WHIP_QUESTION+="\n\n - Ethernet online: PASSED" else criteria_passed=0 WHIP_QUESTION+="\n\n - Ethernet online: FAILED.\nUse dietpi-config to connect and configure ethernet." fi if [ -d /sys/class/net/wlan$(sed -n 2p /DietPi/dietpi/.network) ]; then WHIP_QUESTION+="\n\n - Wifi adapter detected: PASSED" else criteria_passed=0 WHIP_QUESTION+="\n\n - Wifi adapter detected: FAILED.\nPlease connect a WiFi adapter and try again." fi #Passed if (( $criteria_passed == 1 )); then WHIP_QUESTION+="\n\nPASSED: Criteria met. Good to go." whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 14 75 check_criteria=0 #Failed, retry? else WHIP_QUESTION+="\n\nFAILED: Criteria not met. Would you like to check again?" whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --yes-button "Ok" --no-button "Back" --defaultno --backtitle "$WHIP_BACKTITLE" 16 75 CHOICE=$? if (( $CHOICE == 0 )); then echo "retry" &> /dev/null else # - Disable user selection check_criteria=0 aSOFTWARE_INSTALL_STATE[60]=0 aSOFTWARE_INSTALL_STATE[61]=0 whiptail --title "WiFi Hotspot Failed" --msgbox "WiFi Hotspot criteria was not met. Your selection has been removed." --backtitle "$WHIP_BACKTITLE" 10 65 fi fi done fi #Weaved if (( ${aSOFTWARE_INSTALL_STATE[68]} == 1 )); then WHIP_TITLE='Remot3.it - 1st run setup' WHIP_QUESTION='Remot3.it requires you to create an online account, and, link it this device.\n\nOnce DietPi has completed your software installations, and rebooted, please follow the First Run tutorial here:\nhttp://dietpi.com/phpbb/viewtopic.php?f=8&t=5&p=188#p188' whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 14 70 fi #LetsEncrypt if (( ${aSOFTWARE_INSTALL_STATE[92]} == 1 )); then WHIP_TITLE='Lets Encrypt Info' WHIP_QUESTION='Currently, the DietPi installation of CertBot supports Apache2 & Lighttpd only.\n\nOnce the installation has finished, you can setup your free SSL cert with:\n - DietPi-LetsEncrypt\n\nThis is a easy to use frontend for CertBot and allows intergration into DietPi systems.\n\nMore information:\n - http://dietpi.com/phpbb/viewtopic.php?f=8&t=5&p=1061#p1062' whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 18 70 fi #----------------------------------------------------------------------------- #dietpi-config can be used to install/configure the following software. Ask user. #NoIp if (( ${aSOFTWARE_INSTALL_STATE[67]} == 1 )); then WHIP_TITLE='NoIp - Setup Now?' WHIP_QUESTION='NoIp can be setup and configured by using DietPi-Config. Would you like to go there now? \n\n- Once completed, exit DietPi-Config to resume setup. \n\n- More information:\nhttp://dietpi.com/phpbb/viewtopic.php?f=8&t=5&start=10#p58' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --yes-button "Ok" --no-button "Cancel" --defaultno --backtitle "$WHIP_BACKTITLE" 15 70 CHOICE=$? if (( $CHOICE == 0 )); then #Write installed states to temp Write_InstallFileList temp #Launch DietPi-config /DietPi/dietpi/dietpi-config 16 1 #Read installed states from temp Read_InstallFileList temp fi fi #----------------------------------------------------------------------------- #Boot Choices if (( ${aSOFTWARE_INSTALL_STATE[23]} == 1 || ${aSOFTWARE_INSTALL_STATE[24]} == 1 || ${aSOFTWARE_INSTALL_STATE[25]} == 1 || ${aSOFTWARE_INSTALL_STATE[26]} == 1 || ${aSOFTWARE_INSTALL_STATE[31]} == 1 || ${aSOFTWARE_INSTALL_STATE[51]} == 1 || ${aSOFTWARE_INSTALL_STATE[108]} == 1 || ${aSOFTWARE_INSTALL_STATE[112]} == 1 || ${aSOFTWARE_INSTALL_STATE[119]} == 1 || ${aSOFTWARE_INSTALL_STATE[155]} == 1 )); then # Set Boot Order WHIP_TITLE=' DietPi - Boot Options' WHIP_QUESTION='Would you like to configure the auto boot options for DietPi?\n\nThis will allow you to choose which program loads automatically after booting eg:\n - Console\n - Desktop\n - Kodi' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --defaultno --backtitle "$WHIP_BACKTITLE" 14 70 CHOICE=$? if (( $CHOICE == 0 )); then /DietPi/dietpi/dietpi-autostart fi fi } #TARGETMENUID=2 Menu_Linux_Software(){ #Inform User that DietPi software will automatically install additional linux software when required. if (( ! $USER_LINUX_AUTOINSTALL_PROMPT_DISPLAYED )); then WHIP_TITLE='Additional Linux Software' WHIP_QUESTION='DietPi will automatically install additional Linux software on the next screen, when required (eg: Desktop LXDE will install ALSA + Xserver).\n\nThis means you only need to select the software you actually require.' whiptail --title "$WHIP_TITLE" --msgbox "$WHIP_QUESTION" --backtitle "$WHIP_BACKTITLE" 12 70 USER_LINUX_AUTOINSTALL_PROMPT_DISPLAYED=1 fi #----------------------------------------------------------------------------- #Generate Whiptail menu and store results into our software arrays Menu_CreateSoftwareList 1 #Return to Main Menu TARGETMENUID=0 #----------------------------------------------------------------------------- #dietpi-config can be used to install/configure the following software. Ask user. #CurlFTPfs - if (( ${aSOFTWARE_INSTALL_STATE[2]} == 1 )); then WHIP_TITLE='FTP Client - Setup Now?' WHIP_QUESTION='FTP Client as a filesystem mount (CurlFTPfs) can be setup and configured by using DietPi-Config. Would you like to go there now? \n\n- Once completed, exit DietPi-Config to resume setup.' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --yes-button "Ok" --no-button "Cancel" --defaultno --backtitle "$WHIP_BACKTITLE" 13 70 CHOICE=$? if (( $CHOICE == 0 )); then #Write installed states to temp Write_InstallFileList temp #Launch DietPi-config /DietPi/dietpi/dietpi-config 16 1 #Read installed states from temp Read_InstallFileList temp fi fi #SMBCLIENT - if (( ${aSOFTWARE_INSTALL_STATE[1]} == 1 )); then WHIP_TITLE='Samba Client - Setup Now?' WHIP_QUESTION='Samba Client can be setup and configured by using DietPi-Config. Would you like to go there now? \n\n- Once completed, exit DietPi-Config to resume setup.' whiptail --title "$WHIP_TITLE" --yesno "$WHIP_QUESTION" --yes-button "Ok" --no-button "Cancel" --defaultno --backtitle "$WHIP_BACKTITLE" 13 70 CHOICE=$? if (( $CHOICE == 0 )); then #Write installed states to temp Write_InstallFileList temp #Launch DietPi-config /DietPi/dietpi/dietpi-config 16 1 #Read installed states from temp Read_InstallFileList temp fi fi #----------------------------------------------------------------------------- } #TARGETMENUID=3 Menu_Uninstall_Software(){ #Return to main menu TARGETMENUID=0 #Array which will hold all software indexs to be removed. local asoftware_for_uninstall=() local software_installed_count=0 #Obtain list of installed software for ((i=0; i<$TOTAL_SOFTWARE_INDEXS; i++)) do if (( ${aSOFTWARE_INSTALL_STATE[$i]} == 2 && ${aSOFTWARE_TYPE[$i]} >= -1 )); then whiptail_list_array+=("$i" "${aSOFTWARE_WHIP_NAME[$i]}: ${aSOFTWARE_WHIP_DESC[$i]}" "off") ((software_installed_count++)) fi done # - Hide specific software (eg: stacks) in for loop ? if (( $software_installed_count == 0 )); then whiptail --title "Uninstall Software" --msgbox "No software is currently installed, or, available for removal." --backtitle "$WHIP_BACKTITLE" 9 60 #Run menu else whiptail --title "Uninstall Software" --checklist --separate-output "Use the spacebar to select the software you would like to remove." --cancel-button "Cancel" --backtitle "$WHIP_BACKTITLE" 18 75 10 "${whiptail_list_array[@]}" 2>/tmp/dietpi-software_uninstall_results while read choice do case $choice in *) #Convert lined list into a 1 line string. asoftware_for_uninstall+=("$choice") ;; esac done < /tmp/dietpi-software_uninstall_results rm /tmp/dietpi-software_uninstall_results &> /dev/null unset whiptail_list_array #Prompt user with list of their selected software for removal if (( ${#asoftware_for_uninstall[@]} > 0 )); then # - Create list WHIP_QUESTION='The following software will be REMOVED from your system:\n' for ((i=0; i<${#asoftware_for_uninstall[@]}; i++)) do for ((j=0; j<$TOTAL_SOFTWARE_INDEXS; j++)) do if (( ${asoftware_for_uninstall[$i]} == $j )); then WHIP_QUESTION+=" - ${aSOFTWARE_WHIP_NAME[$j]}: ${aSOFTWARE_WHIP_DESC[$j]}\n" break fi done done #Ask for confirmation whiptail --title "Uninstall Software?" --yesno "$WHIP_QUESTION \nDo you wish to continue?" --yes-button "Ok" --no-button "Cancel" --defaultno --backtitle "$WHIP_TITLE" 20 70 CHOICE=$? #Run uninstall if (( $CHOICE == 0 )); then # - stop services /DietPi/dietpi/dietpi-services stop for ((i=0; i<${#asoftware_for_uninstall[@]}; i++)) do Uninstall_Software ${asoftware_for_uninstall[$i]} done #Finish up and clear non-required packages Uninstall_Software_Finalize #Save Write_InstallFileList # - start services /DietPi/dietpi/dietpi-services start #inform user whiptail --title "Uninstall Software" --msgbox "Uninstall completed." --backtitle "$WHIP_BACKTITLE" 9 60 fi fi fi #delete[] arrays unset whiptail_list_array unset asoftware_for_uninstall } #///////////////////////////////////////////////////////////////////////////////////// # Banner Print #///////////////////////////////////////////////////////////////////////////////////// Banner_Setup(){ /DietPi/dietpi/dietpi-banner 0 echo -e "\n Welcome to DietPi-Software \n" } Banner_Installing(){ G_DIETPI-NOTIFY 3 DietPi-Software "Installing ${aSOFTWARE_WHIP_NAME[$INSTALLING_INDEX]}: ${aSOFTWARE_WHIP_DESC[$INSTALLING_INDEX]}" } Banner_Configuration(){ G_DIETPI-NOTIFY 3 DietPi-Software "Configuring ${aSOFTWARE_WHIP_NAME[$INSTALLING_INDEX]}: ${aSOFTWARE_WHIP_DESC[$INSTALLING_INDEX]}" } Banner_Apt_Update(){ G_DIETPI-NOTIFY 3 DietPi-Software "Update & upgrade APT" sleep 1 } Banner_Reboot(){ if (( ! $DISABLE_REBOOT )); then G_DIETPI-NOTIFY 3 DietPi-Software "Installation completed" G_DIETPI-NOTIFY 0 "The system will now reboot. \n This completes the DietPi-Software installation.\n" sleep 3 else G_DIETPI-NOTIFY 0 "DietPi-Software installation completed." fi } Banner_Configs(){ G_DIETPI-NOTIFY 3 DietPi-Software "Optimize and configure software" G_DIETPI-NOTIFY 2 "Applying DietPi optimizations and configurations for $G_HW_MODEL_DESCRIPTION, please wait...\n" } Banner_Aborted(){ #1st run abort if (( $G_DIETPI_INSTALL_STAGE == 0 )); then /DietPi/dietpi/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 else /DietPi/dietpi/dietpi-banner 1 fi } #///////////////////////////////////////////////////////////////////////////////////// # Main Loop #///////////////////////////////////////////////////////////////////////////////////// #-------------------------------------------------------------------------------------- G_DIETPI-NOTIFY 2 "Initializing database, please wait..." #-------------------------------------------------------------------------------------- #Init software arrays Software_Arrays_Init #-------------------------------------------------------------------------------------- #load .installed file, update vars, if it exists Read_InstallFileList #-------------------------------------------------------------------------------------- # - CLi input mode if [ -n "$1" ]; then # - Run input mode Input_Modes "$@" #-------------------------------------------------------------------------------------- #Standard launch else #Check if we are setting no user inputs and prompts # - Load all automation vars if (( $G_DIETPI_INSTALL_STAGE == 0 )); then FirstRun_Automation_Init fi #GPL compliance prompt if (( $G_DIETPI_INSTALL_STAGE == 0 && $G_USER_INPUTS )); then whiptail --title "DietPi - GPLv2 License" --msgbox "This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see http://www.gnu.org/licenses/" --backtitle "DietPi - GPLv2 Compliance" 18 70 fi Banner_Setup #Prevent continue if NTPD is not completed: https://github.com/Fourdee/DietPi/issues/786 Check_NTPD_Status #1st run Connection test and DietPi updates #NB: Contains EXIT path if (( $(cat /DietPi/dietpi/.update_stage) == -1 )); then Check_Internet_Connection FirstRun_DietPi_Update fi #Apply 1st run automation if (( $G_DIETPI_INSTALL_STAGE == 0 )); then #Activate automation settings from dietpi.txt, if set. FirstRun_Automation_Set fi #Start DietPi Menu while (( $TARGETMENUID > -1 )); do clear if (( $TARGETMENUID == 0 )); then Menu_Main elif (( $TARGETMENUID == 1 )); then Menu_Dietpi_Software elif (( $TARGETMENUID == 2 )); then Menu_Linux_Software elif (( $TARGETMENUID == 3 )); then Menu_Uninstall_Software fi done fi #-------------------------------------------------------------------------------------- #Start DietPi-Software installs if (( $GOSTARTINSTALL )); then #Insufficient free space /DietPi/dietpi/dietpi-drive_manager 2 if (( $? != 0 )); then Exit_Destroy fi Check_Internet_Connection #Start installations for software Run_Installations #Upload DietPi-Survey Data /DietPi/dietpi/dietpi-survey &> /dev/null #Reboot Banner_Reboot if (( $DISABLE_REBOOT )); then # - Start services /DietPi/dietpi/dietpi-services start else sync reboot fi fi #----------------------------------------------------------------------------------- Exit_Destroy #----------------------------------------------------------------------------------- }