#!/bin/bash
do {
#////////////////////////////////////
# 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 ---------------------------------------------------------------
source /DietPi/dietpi/func/dietpi-globals
G_CHECK_ROOT_USER
G_CHECK_ROOTFS_RW
export G_PROGRAM_NAME='DietPi-Software'
#Import DietPi-Globals ---------------------------------------------------------------
#/////////////////////////////////////////////////////////////////////////////////////
#Filepath
#/////////////////////////////////////////////////////////////////////////////////////
setglobal FP_INSTALLED_FILE = ''/DietPi/dietpi/.installed''
setglobal FP_INSTALLED_FILE_TEMP = ''/tmp/dietpi-software.installed''
setglobal FP_DIETPIAUTOMATION_LOG = ''/root/DietPi-Automation.log''
#Used to set user/personal data directories (eg: usbdrive)
setglobal FP_DIETPI_DEDICATED_USBDRIVE = ''''
#Uninstall temp file
setglobal UNINSTALL_FILE = ''/tmp/dietpi_uninstall_list''
#Default user content folders used in DietPi.
setglobal FOLDER_MUSIC = ''Music''
setglobal FOLDER_PICTURES = ''Pictures''
setglobal FOLDER_VIDEO = ''Video''
setglobal FOLDER_DOWNLOADS = ''downloads''
proc Write_InstallFileList{
var write_software_in_pending_state = '0'
var fp_target = $FP_INSTALLED_FILE
if test $1 = "temp" {
set fp_target = $FP_INSTALLED_FILE_TEMP
set write_software_in_pending_state = '1'
}
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 << """ >> "$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
"""
>> $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_
}
proc Read_InstallFileList{
var fp_target = $FP_INSTALLED_FILE
if test $1 = "temp" {
set fp_target = $FP_INSTALLED_FILE_TEMP
}
#Load Software states
G_DIETPI-NOTIFY 2 "Reading database, please wait..."
#Load
if test -f $fp_target {
source "$fp_target"
}
#Always reset choice system during first run to defaults: https://github.com/Fourdee/DietPi/issues/1122
if sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
setglobal INDEX_SSHSERVER_CURRENT = '-1'
setglobal INDEX_SSHSERVER_TARGET = '-1'
setglobal INDEX_FILESERVER_CURRENT = '0'
setglobal INDEX_FILESERVER_TARGET = '0'
setglobal INDEX_LOGGING_CURRENT = '-1'
setglobal INDEX_LOGGING_TARGET = '-1'
setglobal INDEX_WEBSERVER_CURRENT = '-2'
setglobal INDEX_WEBSERVER_TARGET = '-2'
}
}
proc 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
}
proc Check_NTPD_Status{
if sh-expr ' $(route | awk '{print $4}' | grep -ci -m1 'UG') ' {
while true
{
/DietPi/dietpi/func/run_ntpd status
if sh-expr ' $? != 0 ' {
# Endless retry
if sh-expr ' ! $G_USER_INPUTS ' {
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 sh-expr ' $? == 1 ' {
Reset_NTPD
} else {
Reset_NTPD
echo 0 > /var/lib/dietpi/.ntpd_exit_status
echo 1 > /var/lib/dietpi/.ntpd_override
}
}
} else {
break
}
}
}
}
#/////////////////////////////////////////////////////////////////////////////////////
# Installation System
#/////////////////////////////////////////////////////////////////////////////////////
#Reboot after installation has finished.
setglobal DISABLE_REBOOT = '0'
#Global Password: Exception to AUTO first run init.
setglobal GLOBAL_PW = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_GLOBAL_PASSWORD=' | sed 's/.*=//]
if test ! -n $GLOBAL_PW {
setglobal GLOBAL_PW = ''dietpi''
}
#Total system RAM (used to calculate percentage based value for software cache levels, eg: opcache/apcu max sizes)
setglobal RAM_TOTAL = $[free -m | grep -m1 'Mem:' | awk '{print $2}]
#Run Installation Flag (1 = run installs)
setglobal GOSTARTINSTALL = '0'
setglobal INSTALL_URL_ADDRESS = ''''
setglobal INSTALL_DESCRIPTION = ''DietPi''
#Special installation Vars
setglobal USER_EMONHUB_APIKEY_COMPLETED = '0'
setglobal USER_EMONHUB_APIKEY_CURRENT = '0'
setglobal WIFIHOTSPOT_RTL8188C_DEVICE = '0'
setglobal USER_LINUX_AUTOINSTALL_PROMPT_DISPLAYED = '0'
#PHP5/7 specific directories, apt package-, module- and command names
setglobal FP_PHP_BASE_DIR = ''/etc/php/7.0''
setglobal PHP_APT_PACKAGE_NAME = ''php''
if sh-expr ' $G_DISTRO < 4 ' {
setglobal FP_PHP_BASE_DIR = ''/etc/php5''
setglobal PHP_APT_PACKAGE_NAME = ''php5''
}
#
setglobal USBDRIVE = '0'
#Choices Made?
setglobal INSTALL_DIETPI_CHOICESMADE = '0'
setglobal INSTALL_LINUX_CHOICESMADE = '0'
#DietPi Choice System: SSH Server
#NB: Update Read_InstallFileList with defaults
setglobal INSTALL_SSHSERVER_CHOICESMADE = '0'
setglobal INDEX_SSHSERVER_CURRENT = '-1'
setglobal INDEX_SSHSERVER_TARGET = '-1'
#DietPi Choice System: Fileserver
#NB: Update Read_InstallFileList with defaults
setglobal INSTALL_FILESERVER_CHOICESMADE = '0'
setglobal INDEX_FILESERVER_CURRENT = '0'
setglobal INDEX_FILESERVER_TARGET = '0'
#DietPi Choice System: Logging
#NB: Update Read_InstallFileList with defaults
setglobal INSTALL_LOGGING_CHOICESMADE = '0'
setglobal INDEX_LOGGING_CURRENT = '-1'
setglobal INDEX_LOGGING_TARGET = '-1'
#DietPi Preference System: Webserver base
#NB: Update Read_InstallFileList with defaults
setglobal INDEX_WEBSERVER_CURRENT = '-2'
setglobal INDEX_WEBSERVER_TARGET = '-2'
#Create DietPi-Software Arrays
# - Categories
setglobal aSOFTWARE_CATEGORIES_DIETPI = '0' #List of cats
setglobal MAX_SOFTWARE_CATEGORIES_DIETPI = '0'
setglobal aSOFTWARE_CATEGORIES_LINUX = '0'
setglobal MAX_SOFTWARE_CATEGORIES_LINUX = '0'
# - Software
#NB: All software has a unique index that must not be changed (eg: DESKTOP_LXDE = 23)
setglobal TOTAL_SOFTWARE_INDEXS = '0'
setglobal TOTAL_SOFTWARE_INDEXS_HARDLIMIT = '171' #Increase as needed. Must be higher than TOTAL_SOFTWARE_INDEXS once calculated in Software_Arrays_Init
setglobal INSTALLING_INDEX = '0' #Which software index is currently being installed?
setglobal aSOFTWARE_CATEGORY_INDEX = '0' #Category index
setglobal aSOFTWARE_TYPE = '0' #0=DietPi 1=Linux | -1=Hidden from install menu, visible in uninstall menu | -2 Hidden from all menus
setglobal aSOFTWARE_INSTALL_STATE = '0' #0=not / 1=tobe, or not tobe that is the... / 2=installed
setglobal aSOFTWARE_WHIP_NAME = '0' #Item name eg: Kodi
setglobal aSOFTWARE_WHIP_DESC = '0' #Blah blah
setglobal FP_ONLINEDOC_URL = ''http://dietpi.com/phpbb/viewtopic.php?''
setglobal aSOFTWARE_ONLINEDOC_URL = '0'
# - Disable software installation, if user input is required for automated installs
setglobal aSOFTWARE_REQUIRES_USERINPUT = '0'
# - Optional pre req software that needs to be installed
setglobal aSOFTWARE_REQUIRES_ALSA = '0'
setglobal aSOFTWARE_REQUIRES_XSERVERXORG = '0'
setglobal aSOFTWARE_REQUIRES_MYSQL = '0'
setglobal aSOFTWARE_REQUIRES_SQLITE = '0'
setglobal aSOFTWARE_REQUIRES_WEBSERVER = '0'
setglobal aSOFTWARE_REQUIRES_DESKTOP = '0'
setglobal aSOFTWARE_REQUIRES_GIT = '0'
setglobal aSOFTWARE_REQUIRES_BUILDESSENTIAL = '0'
setglobal aSOFTWARE_REQUIRES_RSYSLOG = '0'
setglobal aSOFTWARE_REQUIRES_FFMPEG = '0'
setglobal aSOFTWARE_REQUIRES_ORACLEJAVA = '0'
setglobal aSOFTWARE_REQUIRES_NODEJS = '0'
# - Available for
setglobal MAX_G_HW_MODEL = '71' #This needs to match highest G_HW_MODEL value in dietpi-obtain_hw_model
setglobal MAX_G_HW_ARCH = '10'TODO #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 = ''TODO
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'
#
#/////////////////////////////////////////////////////////////////////////////////////
proc Software_Arrays_Init{
#--------------------------------------------------------------------------------
#Categories
#NB: Unique Indexs, do not re-arrange or re-order.
#--------------------------------------------------------------------------------
#DietPi software
setglobal 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
)
setglobal MAX_SOFTWARE_CATEGORIES_DIETPI = $(#aSOFTWARE_CATEGORIES_DIETPI[@])
#Linux software
setglobal 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
)
setglobal MAX_SOFTWARE_CATEGORIES_LINUX = $(#aSOFTWARE_CATEGORIES_LINUX[@])
#--------------------------------------------------------------------------------
#Init | Available For
#--------------------------------------------------------------------------------
#Set available by default for all devices and arch
var 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
var index_current = '0'
#Desktops
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#--------------------------------------------------------------------------------
set 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 sh-expr ' $G_DISTRO >= 4 ' {
for ((i=0; i<$MAX_G_HW_MODEL; i++))
do
aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$i]=0
done
}
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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'
#------------------
set 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
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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]=''
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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]=''
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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 ------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#------------------
set 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'
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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'
#------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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 ------------------
set 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
#--------------------------------------------------------------------------------
set 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 sh-expr ' $G_DISTRO == 3 ' {
aSOFTWARE_AVAIL_G_HW_ARCH[$index_current,3]=0
}
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#--------------------------------------------------------------------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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
#------------------
set 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 sh-expr ' $G_DISTRO < 4 ' {
aSOFTWARE_AVAIL_G_HW_MODEL[$index_current,$G_HW_MODEL]=0
}
#------------------
#Desktop Utilities
#--------------------------------------------------------------------------------
set 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)
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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'
#------------------
set 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)
#--------------------------------------------------------------------------------
set 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'
#------------------
set 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)
#--------------------------------------------------------------------------------
set 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
set 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
set 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
set 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
setglobal 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
#--------------------------------------------------------------------------------
}
proc 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
proc Install_Disable_Requires_UserInput{
if sh-expr ' ! $G_USER_INPUTS ' {
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
}
}
#Work out which additional software we need to install
proc 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
var index = '0'
#Additional software that requires WiringPi
# AudioPhonics Pi-SPC
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[166]} == 1 ' {
aSOFTWARE_INSTALL_STATE[70]=1
}
#Additional Software required by Allo Web Interface
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[159]} == 1 ' {
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
}
#Additional Software required by moOde
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[168]} == 1 ' {
#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
}
#Additional Software required by Google AIY
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[169]} == 1 ' {
aSOFTWARE_INSTALL_STATE[69]=1 # RPi.GPIO
#aSOFTWARE_INSTALL_STATE[130]=1 # python-pip, enabled in #Software that requires Python-Pip
}
#Software that requires Avahi-Daemon
set index = '152'
if sh-expr ' ${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 ' {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$index]} == 0 ' {
aSOFTWARE_INSTALL_STATE[$index]=1
#aSOFTWARE_WHIP_NAME
G_DIETPI-NOTIFY 2 "$(aSOFTWARE_WHIP_NAME[$index]) will be installed"
}
}
#Software that requires Mono
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[41]} == 1 ||
${aSOFTWARE_INSTALL_STATE[144]} == 1 ||
${aSOFTWARE_INSTALL_STATE[145]} == 1 ||
${aSOFTWARE_INSTALL_STATE[147]} == 1 ' {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[150]} == 0 ' {
aSOFTWARE_INSTALL_STATE[150]=1
G_DIETPI-NOTIFY 2 "Mono runtime libary will be installed"
}
}
#Software that requires SDL2:
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[108]} == 1 ' {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[140]} == 0 ' {
aSOFTWARE_INSTALL_STATE[140]=1
G_DIETPI-NOTIFY 2 "SDL2 will be installed"
}
}
#Software that requires Python-Pip: https://github.com/Fourdee/DietPi/issues/784
if sh-expr ' ${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 ' {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[130]} == 0 ' {
aSOFTWARE_INSTALL_STATE[130]=1
G_DIETPI-NOTIFY 2 "Python-Pip will be installed"
}
}
#Software that requires MPD
# YMPD
# Cava
# OMPD
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[32]} == 1 ||
${aSOFTWARE_INSTALL_STATE[119]} == 1 ||
${aSOFTWARE_INSTALL_STATE[129]} == 1 ' {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[128]} == 0 ' {
# - Flag for install
aSOFTWARE_INSTALL_STATE[128]=1
G_DIETPI-NOTIFY 2 "MPD will be installed"
}
}
#OMV (requires Samba, Proftpd)
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[126]} == 1 ' {
#Proftpd
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[94]} == 0 ' {
aSOFTWARE_INSTALL_STATE[94]=1
G_DIETPI-NOTIFY 2 "ProFTP will be installed"
}
#Samba
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[96]} == 0 ' {
aSOFTWARE_INSTALL_STATE[96]=1
G_DIETPI-NOTIFY 2 "Samba Server will be installed"
}
}
#Software that requires Redis
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[47]} == 1 ||
${aSOFTWARE_INSTALL_STATE[114]} == 1 ' {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[91]} == 0 ' {
aSOFTWARE_INSTALL_STATE[91]=1
G_DIETPI-NOTIFY 2 "Redis will be installed"
}
}
#-------------------------------------------------------------------------
#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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[82]} == 1 ' {
aSOFTWARE_INSTALL_STATE[84]=1
aSOFTWARE_INSTALL_STATE[88]=1
aSOFTWARE_INSTALL_STATE[89]=1
}
#LLSP
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[81]} == 1 ' {
aSOFTWARE_INSTALL_STATE[84]=1
aSOFTWARE_INSTALL_STATE[87]=1
aSOFTWARE_INSTALL_STATE[89]=1
}
#LEAP
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[79]} == 1 ' {
aSOFTWARE_INSTALL_STATE[85]=1
aSOFTWARE_INSTALL_STATE[88]=1
aSOFTWARE_INSTALL_STATE[89]=1
}
#LESP
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[78]} == 1 ' {
aSOFTWARE_INSTALL_STATE[85]=1
aSOFTWARE_INSTALL_STATE[87]=1
aSOFTWARE_INSTALL_STATE[89]=1
}
#LAAP
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[76]} == 1 ' {
aSOFTWARE_INSTALL_STATE[83]=1
aSOFTWARE_INSTALL_STATE[88]=1
aSOFTWARE_INSTALL_STATE[89]=1
}
#LASP
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[75]} == 1 ' {
aSOFTWARE_INSTALL_STATE[83]=1
aSOFTWARE_INSTALL_STATE[87]=1
aSOFTWARE_INSTALL_STATE[89]=1
}
#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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
#SQLite
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[87]} >= 1 ' {
#WEBSERVER_LASP
aSOFTWARE_INSTALL_STATE[75]=1
}
#MariaDB
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[88]} >= 1 ' {
#WEBSERVER_LAAP
aSOFTWARE_INSTALL_STATE[76]=1
}
#WEBSERVER_NGINX
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[85]} >= 1 ' {
#SQLite
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[87]} >= 1 ' {
#WEBSERVER_LESP
aSOFTWARE_INSTALL_STATE[78]=1
}
#MariaDB
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[88]} >= 1 ' {
#WEBSERVER_LEAP
aSOFTWARE_INSTALL_STATE[79]=1
}
#WEBSERVER_LIGHTTPD
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[84]} >= 1 ' {
#SQLite
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[87]} >= 1 ' {
#WEBSERVER_LLSP
aSOFTWARE_INSTALL_STATE[81]=1
}
#MariaDB
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[88]} >= 1 ' {
#WEBSERVER_LLAP
aSOFTWARE_INSTALL_STATE[82]=1
}
}
#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
}
proc 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/*
}
proc 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"
}
proc Download_Test_Media{
if test ! -f "$G_FP_DIETPI_USERDATA/$FOLDER_MUSIC"/fourdee_tech.ogg {
#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
}
}
#Return optimization values for BitTorrent servers based on device and hardware capabilities.
proc Optimize_BitTorrent{
var output = '0'
var gigabit_device = '1'
# - Lets hope the next RPi device is finally gigabit capable. I'll cry if it is not.
if sh-expr ' $G_HW_MODEL <= 3 || $G_HW_MODEL == 30 || $G_HW_MODEL == 32 || $G_HW_MODEL == 40 || $G_HW_MODEL == 60 || $G_HW_MODEL == 70 ' {
set gigabit_device = '0'
}
#Cache size (MB) 1/10th of total mem
if sh-expr ' $1 == 0 ' {
set output = $shExpr(' $RAM_TOTAL / 10 ')
#Max active downloads
} elif sh-expr ' $1 == 1 ' {
set output = '2'
# - Bump up for VM's
if sh-expr ' $G_HW_MODEL == 20 || $G_HW_MODEL == 21 ' {
set output = '3'
}
#Max global connections
} elif sh-expr ' $1 == 2 ' {
set output = '20'
# - Bump up for VM's
if sh-expr ' $G_HW_MODEL == 20 || $G_HW_MODEL == 21 ' {
set output = '40'
# - 1Gbit SBC's
} elif sh-expr ' $gigabit_device ' {
set 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 sh-expr ' $G_HW_MODEL == 3 ' {
set output = '15'
# - RPi v2
} elif sh-expr ' $G_HW_MODEL == 2 ' {
set output = '13'
# - RPi v1 256/512
} elif sh-expr ' $G_HW_MODEL <= 1 ' {
set output = '7'
}
#Max upload slots
} elif sh-expr ' $1 == 3 ' {
set output = '3'
# - Bump up for VM's
if sh-expr ' $G_HW_MODEL == 20 || $G_HW_MODEL == 21 ' {
set output = '5'
# - 1Gbit devices
} elif sh-expr ' $gigabit_device ' {
set 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 sh-expr ' $G_HW_MODEL <= 3 ' {
set output = '2'
}
}
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
#
#/////////////////////////////////////////////////////////////////////////////////////
proc Install_Dietpi_Software{
#--------------------------------------------------------------
#Install Software
#Desktop LXDE
setglobal INSTALLING_INDEX = '23'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - For desktop entries/icons hosted on dietpi.com
setglobal 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 ......
}
#Desktop MATE
setglobal INSTALLING_INDEX = '24'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - For desktop entries/icons hosted on dietpi.com
setglobal 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
}
#Desktop GNUStep
setglobal INSTALLING_INDEX = '26'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - For desktop entries/icons hosted on dietpi.com
setglobal 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
}
#DESKTOP_XFCE
setglobal INSTALLING_INDEX = '25'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - For desktop entries/icons hosted on dietpi.com
setglobal 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
}
#XRDP
setglobal INSTALLING_INDEX = '29'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI xrdp
}
#NOMACHINE
setglobal INSTALLING_INDEX = '30'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_DESCRIPTION = '"NoMachine (Secure RDP Server & Client)'"
#x86_64
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/nomachine_5.1.44_1_amd64.deb''
#arm6 (RPi1)
} elif sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/nomachine_5.1.44_3_armv6hf.deb''
#arm7+ (RPi 2/3)
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/nomachine_5.1.44_armhf.deb''
}
# 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
}
#BitTorrent Transmission
setglobal INSTALLING_INDEX = '44'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI transmission-daemon
}
#ProFTPd
setglobal INSTALLING_INDEX = '94'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
echo -e "proftpd-basic shared/proftpd/inetd_or_standalone select standalone" | debconf-set-selections
G_AGI proftpd-basic
}
#Samba Server
setglobal INSTALLING_INDEX = '96'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI samba samba-common-bin --no-install-recommends
}
#vsFTPD
setglobal INSTALLING_INDEX = '95'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI vsftpd --no-install-recommends
}
#NFS_SERVER
setglobal INSTALLING_INDEX = '109'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI nfs-kernel-server nfs-common ucf rpcbind
}
#WEBSERVER_APACHE
setglobal INSTALLING_INDEX = '83'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI apache2
}
#WEBSERVER_NGINX
setglobal INSTALLING_INDEX = '85'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI nginx xml-core --no-install-recommends
}
#WEBSERVER_LIGHTTPD
setglobal INSTALLING_INDEX = '84'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI lighttpd
}
#WEBSERVER_MARIADB
setglobal INSTALLING_INDEX = '88'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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".
test $[readlink /var/lib/mysql] && test ! -d "$[readlink /var/lib/mysql]/mysql" && rm /var/lib/mysql
G_AGI mariadb-server
}
#WEBSERVER_SQLITE
setglobal INSTALLING_INDEX = '87'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI sqlite3
}
#WEBSERVER_REDIS
setglobal INSTALLING_INDEX = '91'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[89]} == 2 ' {
G_AGI "$PHP_APT_PACKAGE_NAME"-redis
}
}
#WEBSERVER_PHP
setglobal INSTALLING_INDEX = '89'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Install base PHP packages/modules.
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
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
sh-expr ' $G_DISTRO < 4 ' && G_AGI php5-xsl
}
#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 sh-expr ' $G_DISTRO >= 4 ' {
G_AGI "$PHP_APT_PACKAGE_NAME"-mbstring "$PHP_APT_PACKAGE_NAME"-zip "$PHP_APT_PACKAGE_NAME"-xml
}
#php-SQL modules
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[86]} >= 1 ' {
G_AGI "$PHP_APT_PACKAGE_NAME"-mysql
}
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[88]} >= 1 ' {
if sh-expr ' $G_DISTRO < 4 ' {
#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
}
}
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[87]} >= 1 ' {
G_AGI "$PHP_APT_PACKAGE_NAME"-sqlite* #wildcard for version (eg:3)
}
#Redis php module
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[91]} >= 1 ' {
G_AGI "$PHP_APT_PACKAGE_NAME"-redis
}
}
#WEBSERVER_MYADMINPHP
setglobal INSTALLING_INDEX = '90'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} == 1 ' {
debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect apache2"
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[84]} == 1 ' {
debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect lighttpd"
} else {
debconf-set-selections <<< "phpmyadmin phpmyadmin/reconfigure-webserver multiselect none"
}
G_AGI phpmyadmin
}
#MPD
setglobal INSTALLING_INDEX = '128'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Jessie
if sh-expr ' $G_DISTRO == 3 ' {
#MPD not available in Jessie Repo for ARMv8
if sh-expr ' $G_HW_ARCH == 3 ' {
setglobal 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
}
#Stretch+
} else {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/mpd_0.20.11-1_''
#armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''armv6''
#armv7+
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''armv7''
#ARMv8
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''armv8''
#x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''amd64''
}
setglobal 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
}
}
#Forums PHPBB
setglobal INSTALLING_INDEX = '54'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#OPENBAZAAR
setglobal INSTALLING_INDEX = '58'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#YACY
setglobal INSTALLING_INDEX = '133'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#ownCloud
setglobal INSTALLING_INDEX = '47'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 test -f /var/www/owncloud/occ {
G_DIETPI-NOTIFY 2 'Existing ownCloud installation found, will NOT overwrite...'
} else {
var datadir = $[grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//]
test -n $datadir || set datadir = ""$G_FP_DIETPI_USERDATA/owncloud_data""
if test -f "$datadir"/dietpi-owncloud-installation-backup/occ {
G_DIETPI-NOTIFY 2 'ownCloud installation backup found, starting recovery...'
G_RUN_CMD cp -a "$datadir"/dietpi-owncloud-installation-backup/. /var/www/owncloud
} else {
setglobal 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
}
}
}
#Nextcloud
setglobal INSTALLING_INDEX = '114'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 test -f /var/www/nextcloud/occ {
G_DIETPI-NOTIFY 2 'Existing Nextcloud installation found, will NOT overwrite...'
} else {
var datadir = $[grep -m1 '^[[:blank:]]*SOFTWARE_NEXTCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//]
test -n $datadir || set datadir = ""$G_FP_DIETPI_USERDATA/nextcloudcloud_data""
if test -f "$datadir"/dietpi-nextcloud-installation-backup/occ {
G_DIETPI-NOTIFY 2 'Nextcloud installation backup found, starting recovery...'
G_RUN_CMD cp -a "$datadir"/dietpi-nextcloud-installation-backup/. /var/www/nextcloud
} else {
setglobal 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
}
}
}
#YMPD
setglobal INSTALLING_INDEX = '32'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
var binary_name = ''ympd_''
# - armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
set binary_name = ''armv6''
# - armv7
} elif sh-expr ' $G_HW_ARCH == 2 ' {
set binary_name = ''armv7''
# - arm64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
set binary_name = ''armv8''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
set binary_name = ''amd64''
}
set binary_name = ""_$G_DISTRO_NAME""
mv $binary_name /usr/bin/ympd
chmod +x /usr/bin/ympd
rm ympd_*
rm package.7z
}
#Roon Bridge
setglobal INSTALLING_INDEX = '121'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#x86_64
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://download.roonlabs.com/builds/RoonBridge_linuxx64.tar.bz2''
#ARMv8
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''http://download.roonlabs.com/builds/RoonBridge_linuxarmv8.tar.bz2''
#ARMv7
} else {
setglobal INSTALL_URL_ADDRESS = ''http://download.roonlabs.com/builds/RoonBridge_linuxarmv7hf.tar.bz2''
}
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
}
#CAVA
setglobal INSTALLING_INDEX = '119'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/cava_0.4.2_armv6.deb''
# - armv7
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/cava_0.4.2_armv7.deb''
# - arm64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/cava_0.4.2_arm64.deb''
}
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
}
#Mopidy
setglobal INSTALLING_INDEX = '118'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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 sh-expr ' $G_DISTRO > 4 ' {
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
}
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
}
#Kodi
setglobal INSTALLING_INDEX = '31'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Odroids
if sh-expr ' $G_HW_MODEL >= 10 ' && sh-expr ' $G_HW_MODEL < 20 ' {
G_AGI kodi-odroid
#XU4 - requires pulse audio (fixes corrupt sound)
if sh-expr ' $G_HW_MODEL == 11 ' {
G_AGI pulseaudio --no-install-recommends
}
#Everything else
} else {
G_AGI kodi
}
# - 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 sh-expr ' $G_DISTRO >= 4 ' {
G_AGI libnfs8 libcec4
} else {
G_AGI libnfs4 libcec3v4
}
}
#MINIDLNA
setglobal INSTALLING_INDEX = '39'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI minidlna
}
#NoIp
setglobal INSTALLING_INDEX = '67'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#x32 x64
if sh-expr ' $G_HW_MODEL == 20 || $G_HW_MODEL == 21 ' {
setglobal INSTALL_URL_ADDRESS = '"http://dietpi.com/downloads/binaries/all/noip_x32_x64.zip'"
#ARMv8
} elif sh-expr ' ( $G_HW_MODEL == 12 ) || ( $G_HW_MODEL >=40 && $G_HW_MODEL < 50 ) ' {
setglobal INSTALL_URL_ADDRESS = '"http://dietpi.com/downloads/binaries/all/noip_arm64.zip'"
#armv6+
} else {
setglobal INSTALL_URL_ADDRESS = '"http://dietpi.com/downloads/binaries/all/noip_armhf.zip'"
}
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
}
#amiberry
setglobal INSTALLING_INDEX = '108'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#dxx-rebirth
setglobal INSTALLING_INDEX = '112'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#urbackup server
setglobal INSTALLING_INDEX = '111'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://hndl.urbackup.org/Server/2.1.20/urbackup-server_2.1.20_amd64.deb''
} elif sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''http://hndl.urbackup.org/Server/2.1.20/urbackup-server_2.1.20_armhf.deb''
#ARMv8 sourcebuild
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''http://hndl.urbackup.org/Server/2.1.20/urbackup-server-2.1.20.tar.gz''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
#ARMv8 source build
if sh-expr ' $G_HW_ARCH == 3 ' {
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
}
}
#OpenTyrian
setglobal INSTALLING_INDEX = '51'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#DietPi Cam
setglobal INSTALLING_INDEX = '59'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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*
}
#DELUGE
setglobal INSTALLING_INDEX = '45'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI deluged deluge-web deluge-webui deluge-console
}
#GRASSHOPPER
setglobal INSTALLING_INDEX = '100'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI python
#Download Grasshopper
var grasshopper_directory = ''/var/www''
setglobal 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
}
#RASPCONTROL
setglobal INSTALLING_INDEX = '106'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#WEBMIN
setglobal INSTALLING_INDEX = '115'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#OMV
setglobal INSTALLING_INDEX = '126'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#O!MPD
setglobal INSTALLING_INDEX = '129'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#IceCast + DarkIce
setglobal INSTALLING_INDEX = '135'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI darkice icecast2
}
#LINUXDASH
setglobal INSTALLING_INDEX = '63'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#PIHOLE
setglobal INSTALLING_INDEX = '93'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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 sh-expr ' $(free -m | grep -m1 'Mem:' | awk '{print $4}') < 512 ' {
if test -f /etc/dphys-swapfile &&
sh-expr ' $(grep 'CONF_SWAPSIZE=' /etc/dphys-swapfile | sed 's/.*=//') < 512 ' {
G_DIETPI-NOTIFY 2 "Increasing swapfile size to 512MB before running gravity.sh, please wait...\n"
/DietPi/dietpi/func/dietpi-set_dphys-swapfile 512
}
}
# 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
var exit_code = $Status
if sh-expr ' $exit_code != 0 ' {
G_DIETPI-NOTIFY 1 "Pi-Hole exited with code ($exit_code) and is not installed."
aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]=0
}
mv /etc/lighttpd/lighttpd.conf.bak /etc/lighttpd/lighttpd.conf &> /dev/null
}
#SUBSONIC 5
setglobal INSTALLING_INDEX = '33'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#SUBSONIC 6
setglobal INSTALLING_INDEX = '34'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#WEAVED
setglobal INSTALLING_INDEX = '68'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#WEBIOPI requires RPIGPIO
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[71]} == 1 ' {
aSOFTWARE_INSTALL_STATE[69]=1
}
#RPIGPIO
setglobal INSTALLING_INDEX = '69'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# >= v111 image
if test -f /etc/.dietpi_image_version {
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
}
}
#WIRINGPI
setglobal INSTALLING_INDEX = '70'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - RPi
if sh-expr ' $G_HW_MODEL < 10 ' {
# http://git.drogon.net/?p=wiringPi;a=shortlog;h=refs/heads/master snapshot
setglobal INSTALL_URL_ADDRESS = ''http://git.drogon.net/?p=wiringPi;a=snapshot;h=HEAD;sf=tgz''
# - Odroid's
} elif sh-expr ' $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 ' {
setglobal INSTALL_URL_ADDRESS = ''https://github.com/hardkernel/wiringPi/archive/master.zip''
# - BPiPro
} elif sh-expr ' $G_HW_MODEL == 51 ' {
setglobal INSTALL_URL_ADDRESS = ''https://github.com/LeMaker/WiringBP/archive/bananapro.zip''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
# - RPi
if sh-expr ' $G_HW_MODEL < 10 ' {
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
}
if sh-expr ' $G_HW_MODEL == 51 ' {
mv WiringBP* wiringPi
}
cd wiringPi*
chmod +x build
./build
cd $HOME
#rm -R /root/wiringPi* #Also Contains example code for users.
}
#RPII2C
setglobal INSTALLING_INDEX = '72'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
/DietPi/dietpi/func/dietpi-set_hardware i2c enable
}
#nodered
setglobal INSTALLING_INDEX = '122'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI python python3
# - RPi, pre-reqs GPIO control for Node-Red
if sh-expr ' $G_HW_MODEL < 10 ' {
G_AGI python-rpi.gpio
}
# - Serialport fails to build unless below flags are provided
npm install -g node-red --unsafe-perm
}
#mosquitto
setglobal INSTALLING_INDEX = '123'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
if sh-expr ' $G_DISTRO > 4 ' {
# On Buster, we can use current APT package from Debian repo
G_AGI mosquitto
} else {
# - ARMv8
if sh-expr ' $G_HW_ARCH == 3 ' {
dpkg --add-architecture armhf
G_AGUP
}
#Pre-Req
# - libssl1.0.0 no longer available: https://github.com/Fourdee/DietPi/issues/1299
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/''
# - ARMv6/7/8
if sh-expr ' $G_HW_ARCH >= 1 && $G_HW_ARCH <= 3 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_armhf.deb''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
wget $INSTALL_URL_ADDRESS -O package.deb
dpkg -i package.deb
rm package.deb
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/mosquitto_1.4.14-0mosquitto1_nows1_armhf.deb''
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/mosquitto_1.4.14-0mosquitto1_nows1_amd64.deb''
}
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
}
}
#Blynk Server
setglobal INSTALLING_INDEX = '131'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Binary URL fails connection test, so we need to parent back a little: https://github.com/Fourdee/DietPi/issues/445#issuecomment-283400449
setglobal INSTALL_URL_ADDRESS = ''https://github.com/blynkkk/blynk-server/releases''
G_CHECK_URL $INSTALL_URL_ADDRESS
mkdir -p /etc/blynkserver
setglobal 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
}
#NAA Daemon
setglobal INSTALLING_INDEX = '124'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - Skip license for NAA daemon if needed:
if sh-expr ' ! $G_USER_INPUTS ' {
debconf-set-selections <<< "networkaudiod networkaudiod/license note false"
}
#Packages
var apackages = ''()
# Jessie - requires stretch packages
if sh-expr ' $G_DISTRO == 3 ' {
set apackages = '(''http://dietpi.com/downloads/binaries/all/gcc-6-base_6.3.0-6_armhf.deb')
set apackages = '(''http://dietpi.com/downloads/binaries/all/libstdc++6_6.3.0-6_armhf.deb')
}
set 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 sh-expr ' $G_DISTRO >= 4 ' {
G_AGI gcc-6-base libstdc++6
}
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
}
#Tomcat8
setglobal INSTALLING_INDEX = '125'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI tomcat8
}
#WEBIOPI
setglobal INSTALLING_INDEX = '71'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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*
}
#DIETPICLOUDSHELL
setglobal INSTALLING_INDEX = '62'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#LCD panels can be enabled in Dietpi-config > display options
# XU4 enable cloudshell
if sh-expr ' $G_HW_MODEL == 11 ' {
/DietPi/dietpi/func/dietpi-set_hardware lcdpanel odroid-cloudshell
}
}
#HAPROXY
setglobal INSTALLING_INDEX = '98'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#SQUEEZEBOXSERVER
setglobal INSTALLING_INDEX = '35'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Stretch
if sh-expr ' $G_DISTRO >= 4 ' {
#Untested ARMv8
if sh-expr ' $G_HW_ARCH == 3 ' {
dpkg --add-architecture armhf
G_AGUP
}
setglobal 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 {
setglobal 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 sh-expr ' $G_HW_ARCH == 1 ' {
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 sh-expr ' $G_HW_ARCH == 3 ' {
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
}
}
}
#WORDPRESS
setglobal INSTALLING_INDEX = '55'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#TIGHTVNCSERVER
setglobal INSTALLING_INDEX = '27'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI tightvncserver x11vnc --no-install-recommends
}
#VNC4SERVER
setglobal INSTALLING_INDEX = '28'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI vnc4server x11vnc --no-install-recommends
# - Stretch+
if sh-expr ' $G_DISTRO >= 4 ' {
G_AGI tigervnc-common
}
}
#REALVNCSERVER
setglobal INSTALLING_INDEX = '120'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#FAIL2BAN
setglobal INSTALLING_INDEX = '73'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
touch /var/log/auth.log #: https://github.com/Fourdee/DietPi/issues/475#issuecomment-310873879
G_AGI fail2ban --no-install-recommends
}
#PHPSYSINFO
setglobal INSTALLING_INDEX = '64'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#PHPIMAGEGALLERY
setglobal INSTALLING_INDEX = '56'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#AMPACHE
setglobal INSTALLING_INDEX = '40'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#OPENVPNSERVER
setglobal INSTALLING_INDEX = '97'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI openvpn easy-rsa iptables
}
#PiVPN
setglobal INSTALLING_INDEX = '117'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
{
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 sh-expr ' $? != 0 ' {
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 sh-expr ' $? != 0 ' {
aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]=0
break
}
} else {
rm pivpn_install.sh
break
}
}
}
#LETSENCRYPT
setglobal INSTALLING_INDEX = '92'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
if sh-expr ' $G_DISTRO >= 4 ' {
G_AGI certbot
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
G_AGI python-certbot-apache
}
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[85]} >= 1 ' {
G_AGI python-certbot-nginx
}
} else {
setglobal 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 ~/
}
}
#TORHOTSPOT requires WIFIHOTSPOT:
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[61]} == 1 ' {
aSOFTWARE_INSTALL_STATE[60]=1
}
#WIFIHOTSPOT
setglobal INSTALLING_INDEX = '60'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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 sh-expr ' $(lsusb | grep -ci -m1 'RTL8188C') ||
$G_HW_MODEL == 70 ' { #Force RTL for allo provided WiFi dongle
setglobal WIFIHOTSPOT_RTL8188C_DEVICE = '1'
}
#Which binary to install
var filename_hostapd = ''''
var filename_hostapd_cli = ''''
# - armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
set filename_hostapd = ''hostapd-nl80211-armv6''
set filename_hostapd_cli = ''hostapd_cli-armv6''
if sh-expr ' $WIFIHOTSPOT_RTL8188C_DEVICE ' {
set filename_hostapd = ''hostapd-rtl8188c-armv6''
}
# - armv7+
} elif sh-expr ' $G_HW_ARCH == 2 ' {
set filename_hostapd = ''hostapd-nl80211-armv7''
set filename_hostapd_cli = ''hostapd_cli-armv7''
if sh-expr ' $WIFIHOTSPOT_RTL8188C_DEVICE ' {
set filename_hostapd = ''hostapd-rtl8188c-armv7''
}
# - arm64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
set filename_hostapd = ''hostapd-nl80211-arm64''
set filename_hostapd_cli = ''hostapd_cli-arm64''
if sh-expr ' $WIFIHOTSPOT_RTL8188C_DEVICE ' {
set filename_hostapd = ''hostapd-rtl8188c-arm64''
}
}
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 sh-expr ' $G_DISTRO >= 4 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/''
# - ARMv6/7
if sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_armhf.deb''
# - ARM64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_arm64.deb''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
wget $INSTALL_URL_ADDRESS -O package.deb
dpkg -i package.deb
rm package.deb
}
}
#TORHOTSPOT
setglobal INSTALLING_INDEX = '61'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - Prereqs
G_AGI tor
}
#SHAIRPORTSYNC
setglobal INSTALLING_INDEX = '37'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/shairport-sync_3.1.3_''
# - ARMv6
if sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''armv6.7z''
# - ARMv7
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''armv7.7z''
# - ARM64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''arm64.7z''
# - x86_64
# elif (( $G_HW_ARCH == 10 )); then
# INSTALL_URL_ADDRESS+='amd64.7z'
}
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 sh-expr ' $G_DISTRO >= 4 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/''
# - ARMv6/7
if sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_armhf.deb''
# - ARM64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_arm64.deb''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''libssl1.0.0_1.0.1t-1+deb8u7_amd64.deb''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
wget $INSTALL_URL_ADDRESS -O package.deb
dpkg -i package.deb
rm package.deb
}
}
#BRUTEFIR
setglobal INSTALLING_INDEX = '38'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check folder is online
setglobal 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/
}
#PYDIO
setglobal INSTALLING_INDEX = '48'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check folder is online
setglobal 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
}
#SQUEEZELITE
setglobal INSTALLING_INDEX = '36'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
var target_binary = ''''
if sh-expr ' $G_HW_ARCH == 1 ' {
set target_binary = ''squeezelite_armv6''
# - ARMv7
} elif sh-expr ' $G_HW_ARCH == 2 ' {
set target_binary = ''squeezelite_armv7''
# - ARM64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
set target_binary = ''squeezelite_arm64''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
set target_binary = ''squeezelite_amd64''
}
ln -sf /usr/bin/"$target_binary" /usr/bin/squeezelite
chmod +x /usr/bin/squeezelite
}
#EMONHUB
setglobal INSTALLING_INDEX = '99'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check, is online
setglobal 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-*
}
#RPIMONITOR
setglobal INSTALLING_INDEX = '66'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check, is online
setglobal 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
}
#NETDATA
setglobal INSTALLING_INDEX = '65'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/netdata_1.6.0_''
#armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''armv6.deb''
#armv7+
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''armv7.deb''
#ARMv8
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''arm64.deb''
#amd64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''amd64.deb''
}
#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
}
#BAIKAL
setglobal INSTALLING_INDEX = '57'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check folder is online
setglobal 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
}
#MUMBLESERVER
setglobal INSTALLING_INDEX = '43'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI mumble-server
}
#EMBYSERVER
setglobal INSTALLING_INDEX = '41'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#ARM packages only available in 14.04 repo: https://github.com/Fourdee/DietPi/issues/1059#issuecomment-313661959
setglobal INSTALL_URL_ADDRESS = ''http://download.opensuse.org/repositories/home:/emby/xUbuntu_14.04/''
# x86_64, use Debian repos
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://download.opensuse.org/repositories/home:/emby/Debian_''
if sh-expr ' $G_DISTRO == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''8.0''
} elif sh-expr ' $G_DISTRO == 4 ' {
setglobal INSTALL_URL_ADDRESS = ''9.0''
} elif sh-expr ' $G_DISTRO == 5 ' {
# http://download.opensuse.org/repositories/home:/emby/Debian_Next/
setglobal INSTALL_URL_ADDRESS = ''Next''
}
setglobal INSTALL_URL_ADDRESS = ''/''
}
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 sh-expr ' $G_HW_ARCH == 2 ' {
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 sh-expr ' $G_HW_ARCH == 3 ' {
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
}
G_AGI emby-server embymagick
}
#PLEXMEDIASERVER
setglobal INSTALLING_INDEX = '42'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check folder is online
#x86_64
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal 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 {
setglobal INSTALL_URL_ADDRESS = ''http://dev2day.de/pms/''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
#x86_64
if sh-expr ' $G_HW_ARCH == 10 ' {
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 sh-expr ' $G_HW_ARCH == 3 ' {
dpkg --add-architecture armhf
G_AGUP
G_AGI binutils:armhf plexmediaserver-installer:armhf
#ARM32
} else {
G_AGI plexmediaserver-installer
}
}
}
#CUBERITE
setglobal INSTALLING_INDEX = '52'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#x86_64
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://builds.cuberite.org/job/Cuberite%20Linux%20x64%20Master/lastSuccessfulBuild/artifact/Cuberite.tar.gz''
#32bit ARM
} elif sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''http://builds.cuberite.org/job/Cuberite%20Linux%20raspi-armhf%20Master/lastSuccessfulBuild/artifact/Cuberite.tar.gz''
}
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
}
#MINEOS
setglobal INSTALLING_INDEX = '53'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check folder is online
setglobal 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
}
#GOGS
setglobal INSTALLING_INDEX = '49'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/gogs_''
#armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''armv6.zip''
#armv7+
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''armv7.zip''
#x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''amd64.zip''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
wget $INSTALL_URL_ADDRESS -O package.zip
unzip -o package.zip
rm package.zip
mv gogs* /etc/gogs
}
#QBITTORRENT
setglobal INSTALLING_INDEX = '46'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI qbittorrent-nox
}
#RTORRENT
setglobal INSTALLING_INDEX = '107'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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 sh-expr ' $G_HW_MODEL < 10 ' {
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
}
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-*
}
#Aria2
setglobal INSTALLING_INDEX = '132'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
if sh-expr ' $G_DISTRO >= 4 ' {
G_AGI aria2
} else {
#aria2 binary
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/aria2_''
# - armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''armv6.7z''
# - armv7+
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''armv7.7z''
# - arm64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''arm64.7z''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''x86_64.7z''
}
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
}
#Web interface
setglobal 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*
}
#SICKRAGE
setglobal INSTALLING_INDEX = '116'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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 sh-expr ' $G_HW_MODEL < 10 ' {
G_AGI unrar-free
} else {
G_AGI unrar
}
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-*
}
#SYNCTHING
setglobal INSTALLING_INDEX = '50'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# - armv6+
if sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-arm-v0.14.42.tar.gz''
# - arm64
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-arm64-v0.14.42.tar.gz''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''https://github.com/syncthing/syncthing/releases/download/v0.14.42/syncthing-linux-amd64-v0.14.42.tar.gz''
}
#??
#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-*
}
#TONIDO
setglobal INSTALLING_INDEX = '134'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
### Pre-reqs
## libjpeg8, libpng12, libssl1.0.0
# https://github.com/Fourdee/DietPi/issues/1428#issuecomment-361099496
# - armv6/7
if sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS1 = ''http://dietpi.com/downloads/binaries/all/libjpeg8_8d1-2_armhf.deb''
sh-expr ' $G_DISTRO > 3 ' && setglobal 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 sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS1 = ''http://dietpi.com/downloads/binaries/all/libjpeg8_8d1-2_amd64.deb''
sh-expr ' $G_DISTRO > 3 ' && setglobal INSTALL_URL_ADDRESS2 = ''http://dietpi.com/downloads/binaries/all/libpng12-0_1.2.50-2+deb8u3_amd64.deb'' || AGI libpng12-0
}
G_CHECK_URL $INSTALL_URL_ADDRESS1
wget $INSTALL_URL_ADDRESS1 -O package.deb
dpkg -i package.deb
rm package.deb
if sh-expr ' $G_DISTRO > 3 ' {
G_CHECK_URL $INSTALL_URL_ADDRESS2
wget $INSTALL_URL_ADDRESS2 -O package.deb
dpkg -i package.deb
rm package.deb
}
## libfontconfig1
G_AGI libfontconfig1
### Tonido
# - armv6+
if sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''http://patch.codelathe.com/tonido/live/installer/armv6l-rpi/tonido.tar.gz''
# - x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://www.tonido.com/download.php?tonido64.tar.gz''
}
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
}
#CHROMIUM
setglobal INSTALLING_INDEX = '113'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Stretch via apt
if sh-expr ' $G_DISTRO >= 4 ' {
if sh-expr ' $G_HW_MODEL < 10 ' {
G_AGI chromium-browser
} else {
G_AGI chromium
}
} else {
#armv6+
if sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/chromium_52.0.2743.116-1-deb8u1.1_armhf.deb''
#ARMv8
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/chromium_52.0.2743.116-1-deb8u1.1_arm64.deb''
}
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 sh-expr ' $G_HW_MODEL >= 10 && $G_HW_MODEL < 20 ' {
G_AGI libgnome-keyring0 libnspr4 libnss3 libnss3-1d libspeechd2 libxslt1.1 libxss1 xdg-utils libgnome-keyring-common libltdl7
} else {
G_AGF
}
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 sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
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 sh-expr ' $G_HW_ARCH == 3 ' {
wget http://dietpi.com/downloads/binaries/all/chromedriver_52.0.2743.116-1-deb8u1.1_arm64.deb -O package.deb
dpkg -i package.deb
}
rm package.deb
# - Prevent Debian repo from replacing our chromium packages: https://github.com/Fourdee/DietPi/issues/658
apt-mark hold chromium chromedriver
}
}
#MotionEye
setglobal INSTALLING_INDEX = '136'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Jessie, prefer latest motion release.
if sh-expr ' $G_DISTRO == 3 ' {
setglobal 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
}
}
#CloudPrint
setglobal INSTALLING_INDEX = '137'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
if sh-expr ' $G_DISTRO == 3 ' { #https://github.com/Fourdee/DietPi/issues/855#issuecomment-292712002
setglobal INSTALL_URL_ADDRESS = ''http://davesteele.github.io/cloudprint-service''
#url/redirect fails wget spider test...
G_CHECK_URL $INSTALL_URL_ADDRESS
setglobal 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
}
}
#VirtualHere
setglobal INSTALLING_INDEX = '138'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''https://virtualhere.com/sites/default/files/usbserver/vhusbd''
#armv6+
if sh-expr ' $G_HW_ARCH == 1 || $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''arm''
#ARMv8
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''arm64''
#x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''x86_64''
}
G_CHECK_URL $INSTALL_URL_ADDRESS
mkdir -p /etc/vhusbd
wget $INSTALL_URL_ADDRESS -O /etc/vhusbd/vhusbd
chmod +x /etc/vhusbd/vhusbd
}
#sabnzbd
setglobal INSTALLING_INDEX = '139'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
var version = ''2.3.2''
setglobal 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 sh-expr ' $G_HW_MODEL < 10 ' {
G_AGI unrar-free
} else {
G_AGI unrar
}
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
}
#spotifyconnectweb
setglobal INSTALLING_INDEX = '141'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''https://github.com/Fornoth/spotify-connect-web/releases'' #full path fails wget spider test...
G_CHECK_URL $INSTALL_URL_ADDRESS
setglobal 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
}
#couchpotato
setglobal INSTALLING_INDEX = '142'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#Koel
setglobal INSTALLING_INDEX = '143'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#Sonarr
setglobal INSTALLING_INDEX = '144'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FDA5DFFC
if sh-expr ' $G_HW_ARCH == 3 ' {
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
}
G_AGUP
G_AGI nzbdrone
}
#Radarr
setglobal INSTALLING_INDEX = '145'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#PlexPy
setglobal INSTALLING_INDEX = '146'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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/
}
#Jackett
setglobal INSTALLING_INDEX = '147'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#JRiver
setglobal INSTALLING_INDEX = '148'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#NZBget
setglobal INSTALLING_INDEX = '149'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''https://nzbget.net''
G_CHECK_URL $INSTALL_URL_ADDRESS
setglobal 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
}
#------------------ Bittorrent: HTPC Manager ------------------
setglobal INSTALLING_INDEX = '155'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#OctoPrint
setglobal INSTALLING_INDEX = '153'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#RoonServer
setglobal INSTALLING_INDEX = '154'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#Steam
setglobal INSTALLING_INDEX = '156'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
debconf-set-selections <<< "steam steam/question select I AGREE"
G_AGI steam
}
#Minio
setglobal INSTALLING_INDEX = '158'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''https://dl.minio.io/server/minio/release/linux-amd64/minio''
} else {
setglobal INSTALL_URL_ADDRESS = ''https://dl.minio.io/server/minio/release/linux-arm/minio''
}
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
setglobal 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
}
#Docker
setglobal INSTALLING_INDEX = '162'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#FuguHub
setglobal INSTALLING_INDEX = '161'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''http://FuguHub.com/install/FuguHub.linux.install''
} else {
setglobal INSTALL_URL_ADDRESS = ''http://FuguHub.com/releases/raspberrypi/install.sh''
}
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
}
#Nukkit
setglobal INSTALLING_INDEX = '164'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#GITEA
setglobal INSTALLING_INDEX = '165'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''https://dl.gitea.io/gitea/1.3.2/gitea-1.3.2-''
#armv6
if sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''linux-arm-6''
#armv7
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''linux-arm-7''
#armv8
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''linux-arm64''
#x86_64
} elif sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''linux-amd64''
}
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
}
#Allo Web Interface
setglobal INSTALLING_INDEX = '159' #160 for quick reinstall
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ||
${aSOFTWARE_INSTALL_STATE[160]} == 1 ' {
Banner_Installing
setglobal 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
}
#Gmediarender
setglobal INSTALLING_INDEX = '163'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal INSTALL_URL_ADDRESS = ''http://dietpi.com/downloads/binaries/all/gmrender_1_''
if sh-expr ' $G_HW_ARCH == 10 ' {
setglobal INSTALL_URL_ADDRESS = ''amd64.deb''
} elif sh-expr ' $G_HW_ARCH == 3 ' {
setglobal INSTALL_URL_ADDRESS = ''arm64.deb''
} elif sh-expr ' $G_HW_ARCH == 2 ' {
setglobal INSTALL_URL_ADDRESS = ''armv7.deb''
} elif sh-expr ' $G_HW_ARCH == 1 ' {
setglobal INSTALL_URL_ADDRESS = ''armv6.deb''
}
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
}
#AudioPhonics Pi-SPC
setglobal INSTALLING_INDEX = '166'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#NB: Please see configuration section
}
#Raspotify
setglobal INSTALLING_INDEX = '167'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#moOde
setglobal INSTALLING_INDEX = '168'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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 sh-expr ' $G_HW_MODEL < 10 ' {
G_AGI pi-bluetooth
}
#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.
}
#Google AIY
setglobal INSTALLING_INDEX = '169'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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 sh-expr ' $G_HW_ARCH == 2 ' {
env/bin/pip install google-assistant-library==0.0.3
}
# - 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
}
#-------------------------------------------------------------------
#Reset error handler (eg: for usermsg clear set in Banner_Installing)
G_ERROR_HANDLER_RESET
#-------------------------------------------------------------------
}
proc Install_Linux_Software{
setglobal INSTALLING_INDEX = '5'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI alsa-utils
#Apply soundcard
var soundcard = $[cat /DietPi/dietpi.txt | grep -m1 '^CONFIG_SOUNDCARD=' | sed 's/.*=//]
# - RPi enable internal HDMI+Analogue if currently set to 'none'
if sh-expr ' $G_HW_MODEL < 10 ' &&
test $soundcard = "none" || test $soundcard = "default" {
set soundcard = ''rpi-bcm2835''
}
# - Apply
/DietPi/dietpi/func/dietpi-set_hardware soundcard $soundcard
}
setglobal INSTALLING_INDEX = '6'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /etc/xdg/autostart/xcompmgr.desktop
[Desktop Entry]
Type=Application
Name=xcompmgr
NoDisplay=true
Exec=xcompmgr -a
"""
> /etc/xdg/autostart/xcompmgr.desktop
[Desktop Entry]
Type=Application
Name=xcompmgr
NoDisplay=true
Exec=xcompmgr -a
_EOF_
#RPI
if sh-expr ' $G_HW_MODEL < 10 ' {
sleep 1
#Odroid C2
} elif sh-expr ' $G_HW_MODEL == 12 ' {
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 << """ > /etc/X11/xorg.conf
Section "Device"
Identifier "FBTurbo"
Driver "fbturbo"
Option "fbdev" "/dev/fb0"
Option "SwapbuffersWait" "true"
#Option "Rotate" "CCW"
EndSection
"""
> /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 sh-expr ' $G_HW_MODEL == 11 ' {
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 sh-expr ' $G_HW_MODEL == 10 ' {
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 sh-expr ' $G_HW_MODEL == 40 ' {
setglobal 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 << """ > /etc/X11/xorg.conf
Section "Device"
Identifier "Allwinner A10/A13 FBDEV"
Driver "fbturbo"
Option "fbdev" "/dev/fb0"
Option "SwapbuffersWait" "true"
EndSection
"""
> /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_
}
}
#Nvidia driver
setglobal INSTALLING_INDEX = '151'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Install
G_AGI nvidia-driver nvidia-xconfig
# + i386 OpenGL
G_AGI libgl1-nvidia-glx:i386
}
#Avahi-Daemon
setglobal INSTALLING_INDEX = '152'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI avahi-daemon
}
setglobal INSTALLING_INDEX = '16'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI build-essential make autoconf automake --no-install-recommends
}
setglobal INSTALLING_INDEX = '170'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
setglobal INSTALLING_INDEX = '17'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI git --no-install-recommends
}
setglobal INSTALLING_INDEX = '4'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI vifm
}
setglobal INSTALLING_INDEX = '20'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI vim
}
setglobal INSTALLING_INDEX = '21'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI vim-tiny
}
setglobal INSTALLING_INDEX = '127'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI neovim
}
setglobal INSTALLING_INDEX = '18'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI emacs
}
setglobal INSTALLING_INDEX = '12'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI iperf
}
setglobal INSTALLING_INDEX = '3'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI mc
}
setglobal INSTALLING_INDEX = '19'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI jed
}
setglobal INSTALLING_INDEX = '10'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI iftop
}
setglobal INSTALLING_INDEX = '11'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI iptraf
}
setglobal INSTALLING_INDEX = '13'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI mtr-tiny
}
setglobal INSTALLING_INDEX = '14'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI nload
}
setglobal INSTALLING_INDEX = '15'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI tcpdump
}
setglobal INSTALLING_INDEX = '0'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI openssh-client
}
setglobal INSTALLING_INDEX = '1'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Remove Information file
rm /mnt/samba/readme.txt &> /dev/null
G_AGI smbclient cifs-utils --no-install-recommends
}
setglobal INSTALLING_INDEX = '2'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Remove information file
rm /mnt/ftp_client/readme.txt &> /dev/null
G_AGI curlftpfs
}
setglobal INSTALLING_INDEX = '110'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#Remove information file
rm /mnt/nfs_client/readme.txt &> /dev/null
G_AGI nfs-common
}
setglobal INSTALLING_INDEX = '104'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI dropbear
#set to start on next boot
sed -i '/NO_START=1/c\NO_START=0' /etc/default/dropbear
}
setglobal INSTALLING_INDEX = '105'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
setglobal INSTALLING_INDEX = '103'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
setglobal INSTALLING_INDEX = '101'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI logrotate --no-install-recommends
}
setglobal INSTALLING_INDEX = '102'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
G_AGI rsyslog --no-install-recommends
}
setglobal INSTALLING_INDEX = '7'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#RPi + OpenMAX HW Encoding: https://github.com/Fourdee/DietPi/issues/869
if sh-expr ' $G_HW_MODEL < 10 ' {
setglobal 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
}
}
setglobal INSTALLING_INDEX = '8'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
# On Jessie use backports repo:
if sh-expr ' $G_DISTRO == 3 ' {
cat << """ > /etc/apt/preferences.d/99-dietpi-openjdk-8-jdk
Package: openjdk-8-jdk
Pin: release a=jessie-backports
Pin-Priority: 990
"""
> /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
}
}
setglobal INSTALLING_INDEX = '9'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
#check, is online
setglobal 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
}
setglobal INSTALLING_INDEX = '130'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#SDL2
setglobal INSTALLING_INDEX = '140'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal 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
}
#Mono repo
setglobal INSTALLING_INDEX = '150'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_HW_ARCH == 1 ' {
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
}
G_AGUP
G_AGI mono-runtime
}
#------------------ Home Automation: Home Assistant ------------------
setglobal INSTALLING_INDEX = '157'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Installing
setglobal HA_USER = '"homeassistant'"
setglobal HA_USERROOT = ""/home/$HA_USER""
setglobal HA_SRVROOT = '"/srv/homeassistant'"
setglobal HA_PYENV_ACTIVATION = ""export PATH=\"$HA_USERROOT/.pyenv/bin:\$PATH\"; eval \"\$(pyenv init -)\"; eval \"\$(pyenv virtualenv-init -)"\""
setglobal 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 sh-expr ' $G_DISTRO < 4 ' {
G_AGI libmysqlclient-dev
} else {
G_AGI libmariadbclient-dev
}
# 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
}
#-------------------------------------------------------------------
#Reset error handler (eg: for usermsg clear set in Banner_Installing)
G_ERROR_HANDLER_RESET
#-------------------------------------------------------------------
}
proc Uninstall_NonSelected_Choices{
#Uninstall software using our temp uninstall list
if test -f $UNINSTALL_FILE {
#Run the temp uninstall script
while read -r line
{
Uninstall_Software $line
} < $UNINSTALL_FILE
rm $UNINSTALL_FILE
}
}
proc 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 sh-expr ' $INDEX_SSHSERVER_TARGET != $INDEX_SSHSERVER_CURRENT ' {
# - No SSH server
if sh-expr ' $INDEX_SSHSERVER_TARGET == 0 ' {
echo -e "104" >> $UNINSTALL_FILE
echo -e "105" >> $UNINSTALL_FILE
# - Dropbear
} elif sh-expr ' $INDEX_SSHSERVER_TARGET == -1 ' {
aSOFTWARE_INSTALL_STATE[104]=1
echo -e "105" >> $UNINSTALL_FILE
# - Openssh
} elif sh-expr ' $INDEX_SSHSERVER_TARGET == -2 ' {
aSOFTWARE_INSTALL_STATE[105]=1
echo -e "104" >> $UNINSTALL_FILE
}
#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
setglobal INDEX_SSHSERVER_CURRENT = $INDEX_SSHSERVER_TARGET
}
}
proc 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 sh-expr ' $INDEX_FILESERVER_TARGET != $INDEX_FILESERVER_CURRENT ' {
#No File server
if sh-expr ' $INDEX_FILESERVER_TARGET == 0 ' {
echo -e "96" >> $UNINSTALL_FILE
echo -e "94" >> $UNINSTALL_FILE
#echo -e "95" >> "$UNINSTALL_FILE"
#ProFTP
} elif sh-expr ' $INDEX_FILESERVER_TARGET == -1 ' {
aSOFTWARE_INSTALL_STATE[94]=1
echo -e "96" >> $UNINSTALL_FILE
#Samba
} elif sh-expr ' $INDEX_FILESERVER_TARGET == -2 ' {
aSOFTWARE_INSTALL_STATE[96]=1
echo -e "94" >> $UNINSTALL_FILE
}
#Update Current SSHSERVER index
setglobal INDEX_FILESERVER_CURRENT = $INDEX_FILESERVER_TARGET
}
}
proc 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 sh-expr ' $INDEX_LOGGING_TARGET != $INDEX_LOGGING_CURRENT ' {
#None
if sh-expr ' $INDEX_LOGGING_TARGET == 0 ' {
echo -e "101" >> $UNINSTALL_FILE
echo -e "103" >> $UNINSTALL_FILE
echo -e "102" >> $UNINSTALL_FILE
#Ramlog - clear every 24H
} elif sh-expr ' $INDEX_LOGGING_TARGET == -1 ' {
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 sh-expr ' $INDEX_LOGGING_TARGET == -2 ' {
aSOFTWARE_INSTALL_STATE[103]=1
echo -e "101" >> $UNINSTALL_FILE
echo -e "102" >> $UNINSTALL_FILE
#Logrotate + rsyslog - logs to disk
} elif sh-expr ' $INDEX_LOGGING_TARGET == -3 ' {
aSOFTWARE_INSTALL_STATE[101]=1
aSOFTWARE_INSTALL_STATE[102]=1
echo -e "103" >> $UNINSTALL_FILE
}
#Update Current Logging index
setglobal INDEX_LOGGING_CURRENT = $INDEX_LOGGING_TARGET
}
}
proc Apply_Webserver_Preference{
if sh-expr ' $INDEX_WEBSERVER_TARGET != $INDEX_WEBSERVER_CURRENT ' {
#Update Current to Target
setglobal INDEX_WEBSERVER_CURRENT = $INDEX_WEBSERVER_TARGET
}
}
proc 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
var datadir = $[cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_OWNCLOUD_DATADIR=' | sed 's/.*=//]
test ! -n $datadir && set datadir = ""$G_FP_DIETPI_USERDATA/owncloud_data""
chown -R www-data:www-data $datadir
set datadir = $[cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_NEXTCLOUD_DATADIR=' | sed 's/.*=//]
test ! -n $datadir && set 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
#
#/////////////////////////////////////////////////////////////////////////////////////
proc Install_Apply_Configs{
# Copy/Set optimised Software settings.
# Set install states to 2 (installed).
#DESKTOP_LXDE
setglobal INSTALLING_INDEX = '23'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#Desktop MATE
setglobal INSTALLING_INDEX = '24'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_HW_MODEL == 12 &&
! $(cat /etc/pulse/default.pa | grep -ci -m1 '^set-default-sink alsa_output.platform-odroid_hdmi.37.analog-stereo') ' {
echo -e "set-default-sink alsa_output.platform-odroid_hdmi.37.analog-stereo" >> /etc/pulse/default.pa
}
}
#Desktop GNUStep
setglobal INSTALLING_INDEX = '26'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
Create_Desktop_Shared_Items
}
#DESKTOP_XFCE
setglobal INSTALLING_INDEX = '25'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
Create_Desktop_Shared_Items
}
#WEBSERVER_APACHE
setglobal INSTALLING_INDEX = '83'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#create www directory
mkdir -p /var/www
#Apache2 confs
cp /DietPi/dietpi/conf/apache2_jessie.conf /etc/apache2/apache2.conf
cat << """ > /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
"""
> /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 << """ > /etc/apache2/mods-available/mpm_event.conf
StartServers $G_HW_CPU_CORES
MinSpareThreads 1
MaxSpareThreads 8
ThreadLimit 16
ThreadsPerChild 4
MaxRequestWorkers 50
MaxConnectionsPerChild 0
"""
> /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 << """ > /etc/apache2/mods-available/mpm_prefork.conf
StartServers $G_HW_CPU_CORES
MinSpareServers 1
MaxSpareServers $G_HW_CPU_CORES
MaxRequestWorkers 50
MaxConnectionsPerChild 0
"""
> /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 << """ > /etc/apache2/mods-available/mpm_worker.conf
StartServers $G_HW_CPU_CORES
MinSpareThreads 1
MaxSpareThreads 8
ThreadLimit 16
ThreadsPerChild 4
MaxRequestWorkers 50
MaxConnectionsPerChild 0
"""
> /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/*
}
#WEBSERVER_NGINX
setglobal INSTALLING_INDEX = '85'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_DISTRO >= 4 ' {
sed -i "s#/run/php5-fpm.sock#/run/php/php7.0-fpm.sock#g" /etc/nginx/nginx.conf
}
# - CPU core count
sed -i "/worker_processes/c\worker_processes $G_HW_CPU_CORES;" /etc/nginx/nginx.conf
#Default site
cp /DietPi/dietpi/conf/nginx.site-available-default /etc/nginx/sites-available/default
# - Stretch , set php7.0
if sh-expr ' $G_DISTRO >= 4 ' {
sed -i "s#/run/php5-fpm.sock#/run/php/php7.0-fpm.sock#g" /etc/nginx/sites-available/default
}
# - Nginx index page
cp /usr/share/nginx/html/index.html /var/www/index.html
}
#WEBSERVER_LIGHTTPD
setglobal INSTALLING_INDEX = '84'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
var fp_php_fpm_sock = ''/var/run/php/php7.0-fpm.sock''
if sh-expr ' $G_DISTRO == 3 ' {
set fp_php_fpm_sock = ''/var/run/php5-fpm.sock''
}
cat << """ > /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"
))
)
"""
> /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
}
#WEBSERVER_PHP
setglobal INSTALLING_INDEX = '89'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - Apache2 has its own PHP module
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
# https://github.com/Fourdee/DietPi/issues/1144
var php_service = ''/lib/systemd/system/apache2.service''
# - All other webservers (eg: Nginx/Lighttpd) use PHP-FPM
} else {
var 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 = $shExpr(' $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
}
# PHP cache settings
var target_php_ini = '0'
var target_php_cachesize = $shExpr(' $RAM_TOTAL / 30 ')
if sh-expr ' $target_php_cachesize < 10 ' {
set target_php_cachesize = '10'
}
# - OPcache
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
set target_php_ini = ""$FP_PHP_BASE_DIR/apache2/php.ini""
} else {
set target_php_ini = ""$FP_PHP_BASE_DIR/fpm/php.ini""
}
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
set 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
set target_php_cachesize = '"M'"
# - - 3days TTL
var target_apc_ttl = ''259200''
cat << """ > "$target_php_ini"
extension=apcu.so
apc.shm_size=$target_php_cachesize
apc.ttl=$target_apc_ttl
"""
> $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.
var 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 {
var tmp_upload_dir = '"/var/tmp'"
} else {
var tmp_upload_dir = '"/var/tmp/php_upload_tmp'"
mkdir -p $tmp_upload_dir
chown -R www-data:www-data $tmp_upload_dir
}
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
var php_max_upload_size = ""$shExpr(' $(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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[85]} >= 1 ' {
sed -i "/client_max_body_size/c\ client_max_body_size $php_max_upload_size;" /etc/nginx/nginx.conf
}
# - 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.
var 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
}
#WEBSERVER_MARIADB
setglobal INSTALLING_INDEX = '88'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# Move SQL store to userdata location: https://github.com/Fourdee/DietPi/issues/672
if test $[readlink /var/lib/mysql] != "$G_FP_DIETPI_USERDATA/mysql/" {
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 sh-expr ' $? != 0 ' {
G_DIETPI-NOTIFY 1 "Moving of MySQL data store failed to $G_FP_DIETPI_USERDATA/mysql. DietPi-Software will now exit"
Exit_Destroy
}
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
}
# On Jessie assure unix_socket authentication:
if sh-expr ' $G_DISTRO < 4 ' {
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
}
### 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_
}
#WEBSERVER_MYADMINPHP
setglobal INSTALLING_INDEX = '90'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#NGINX LIGHTTPD symlink to var www
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[84]} >= 1 ||
${aSOFTWARE_INSTALL_STATE[85]} >= 1 ' {
ln -sf /usr/share/phpmyadmin /var/www
}
# 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"
}
#WEBSERVER_REDIS
setglobal INSTALLING_INDEX = '91'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# Enable redis php module, if installed:
"$PHP_APT_PACKAGE_NAME"enmod redis !2 > /dev/null
}
#OPENBAZAAR
setglobal INSTALLING_INDEX = '58'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - service
cat << """ > /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
"""
> /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_
}
#YaCy
setglobal INSTALLING_INDEX = '133'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
chmod +x -R /etc/yacy
cat << """ > /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
"""
> /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
}
#ownCloud
setglobal INSTALLING_INDEX = '47'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_DISTRO > 3 ' {
phpenmod ctype dom fileinfo iconv mbstring posix simplexml xmlwriter xmlreader zip exif
}
# 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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
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
var owncloud_conf = ''/etc/apache2/sites-available/owncloud.conf''
if test -f $owncloud_conf {
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'
set owncloud_conf = ''/etc/apache2/sites-available/owncloud.conf.dietpi-new''
}
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
}
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[85]} >= 1 ' {
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"'
var owncloud_config = ''/etc/nginx/sites-dietpi/owncloud.config''
if test -f $owncloud_config {
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'
set owncloud_config = ''/etc/nginx/sites-dietpi/owncloud.config.dietpi-new''
}
cp /DietPi/dietpi/conf/nginx.sites-dietpi.owncloud.config $owncloud_config
# Stretch: Use PHP7.0 socket and set 'fastcgi_request_buffering off';
if sh-expr ' $G_DISTRO > 3 ' {
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
}
# 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 sh-expr ' $? == 0 || $? == 5' {
sed -i 's/#fastcgi_param HTTPS on;/fastcgi_param HTTPS on;/g' $owncloud_config
}
}
# 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 << """ > /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf
[mysqld]
innodb_large_prefix=1
innodb_file_format=barracuda
innodb_file_per_table=1
"""
> /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:
source /DietPi/dietpi/func/dietpi-globals
# Adjusting config file:
var config_php = ''/var/www/owncloud/config/config.php''
var datadir = $[grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//]
test -n $datadir || set datadir = ""$G_FP_DIETPI_USERDATA/owncloud_data""
mkdir -p $datadir
Install_Apply_Permissions &> /dev/null
if test -d "$G_FP_DIETPI_USERDATA"/mysql/owncloud {
G_DIETPI-NOTIFY 2 'ownCloud database found, will NOT overwrite.'
} else {
if test -f "$datadir"/dietpi-owncloud-database-backup.sql {
G_DIETPI-NOTIFY 2 'ownCloud database backup found, starting recovery...'
var dbuser = $[grep -m1 "^[[:blank:]]*'dbuser'" $config_php | awk '{print $3}' | sed "s/[',]//g]
var 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 {
var username = $[cat /DietPi/dietpi.txt | grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_NEXTCLOUD_USERNAME=' | sed 's/^.*=//]
test -n $username || set 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'"
}
}
# 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 sh-expr ' ! $(cat $config_php | grep -ci -m1 "1 => '") ' {
sed -i "/0 => 'localhost'/a 1 => '$[sed -n 4p /DietPi/dietpi/.network]'," $config_php
sed -i "/1 => '/a 2 => '$[cat /etc/hostname]'," $config_php
}
# 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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
grep -q "^[[:blank:]]*'htaccess.RewriteBase'" $config_php || sed -i "/^[[:blank:]]*'overwrite.cli.url'/a \ \ 'htaccess.RewriteBase' => '/owncloud'," $config_php
occ maintenance:update:htaccess
}
# 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:
var 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
var redis_sock = $[grep "^[[:blank:]]*unixsocket /" $redis_conf | sed "s/^[[:blank:]]*unixsocket //]
usermod -a -G redis www-data
# - Enable ownCloud to use Redis socket:
if sh-expr ' ! $(cat $config_php | grep -ci -m1 "'memcache.locking'") ' {
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
}
# Enable ownCloud background cron job:
crontab -u www-data -l !2 >/dev/null | grep -q '/var/www/owncloud/cron.php' || shell { 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
}
#Nextcloud
setglobal INSTALLING_INDEX = '114'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_DISTRO > 3 ' {
phpenmod ctype dom fileinfo iconv mbstring posix simplexml xmlwriter xmlreader zip exif
}
# 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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
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
var nextcloud_conf = ''/etc/apache2/sites-available/nextcloud.conf''
if test -f $nextcloud_conf {
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'
set nextcloud_conf = ''/etc/apache2/sites-available/nextcloud.conf.dietpi-new''
}
cp /DietPi/dietpi/conf/apache.ownnextcloud.conf $nextcloud_conf
a2ensite nextcloud !1 > /dev/null
}
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[85]} >= 1 ' {
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"'
var nextcloud_config = ''/etc/nginx/sites-dietpi/nextcloud.config''
if test -f $nextcloud_config {
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'
set nextcloud_config = ''/etc/nginx/sites-dietpi/nextcloud.config.dietpi-new''
}
cp /DietPi/dietpi/conf/nginx.sites-dietpi.nextcloud.config $nextcloud_config
# Stretch: Use PHP7.0 socket and set 'fastcgi_request_buffering off';
if sh-expr ' $G_DISTRO > 3 ' {
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
}
# 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 sh-expr ' $? == 0 || $? == 5' {
sed -i 's/#fastcgi_param HTTPS on;/fastcgi_param HTTPS on;/g' $nextcloud_config
}
}
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[84]} >= 1 ' {
G_DIETPI-NOTIFY 2 'Lighttpd webserver found, enable Nextcloud specific configuration.'
var 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
test ! -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
}
# Enable 4-byte support for MariaDB: https://docs.nextcloud.com/server/12/admin_manual/configuration_database/mysql_4byte_support.html
cat << """ > /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf
[mysqld]
innodb_large_prefix=1
innodb_file_format=barracuda
innodb_file_per_table=1
"""
> /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:
source /DietPi/dietpi/func/dietpi-globals
# Adjusting config file:
var config_php = ''/var/www/nextcloud/config/config.php''
var datadir = $[grep -m1 '^[[:blank:]]*SOFTWARE_NEXTCLOUD_DATADIR=' /DietPi/dietpi.txt | sed 's/^.*=//]
test -n $datadir || set datadir = ""$G_FP_DIETPI_USERDATA/nextcloud_data""
mkdir -p $datadir
Install_Apply_Permissions &> /dev/null
if test -d "$G_FP_DIETPI_USERDATA"/mysql/nextcloud {
G_DIETPI-NOTIFY 2 'Nextcloud database found, will NOT overwrite.'
} else {
if test -f "$datadir"/dietpi-nextcloud-database-backup.sql {
G_DIETPI-NOTIFY 2 'Nextcloud database backup found, starting recovery...'
var dbuser = $[grep -m1 "^[[:blank:]]*'dbuser'" $config_php | awk '{print $3}' | sed "s/[',]//g]
var 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 {
var username = $[grep -m1 '^[[:blank:]]*SOFTWARE_OWNCLOUD_NEXTCLOUD_USERNAME=' /DietPi/dietpi.txt | sed 's/^.*=//]
test -n $username || set 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'"
}
}
# 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 sh-expr ' ! $(cat $config_php | grep -ci -m1 "1 => '*'") ' {
sed -i "/0 => 'localhost'/a 1 => '*'," $config_php
}
# 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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
grep -q "^[[:blank:]]*'htaccess.RewriteBase'" $config_php || sed -i "/^[[:blank:]]*'overwrite.cli.url'/a \ \ 'htaccess.RewriteBase' => '/nextcloud'," $config_php
ncc maintenance:update:htaccess
}
# 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:
var 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
var redis_sock = $[grep "^[[:blank:]]*unixsocket /" $redis_conf | sed "s/^[[:blank:]]*unixsocket //]
usermod -a -G redis www-data
# - Enable Nextloud to use Redis socket:
if sh-expr ' ! $(cat $config_php | grep -ci -m1 "'memcache.locking'") ' {
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
}
# Enable Nextcloud background cron job:
crontab -u www-data -l !2 >/dev/null | grep -q '/var/www/nextcloud/cron.php' || shell { 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
}
# Transmission
setglobal INSTALLING_INDEX = '44'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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
"""
> /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 << """ > /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
}
"""
> /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
}
#PHPBB
setglobal INSTALLING_INDEX = '54'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
/DietPi/dietpi/func/create_mysql_db phpbb3 phpbb3 $GLOBAL_PW
}
#MPD
setglobal INSTALLING_INDEX = '128'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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
"""
> /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 << """ > /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
"""
> /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 sh-expr ' $(cat /DietPi/dietpi.txt | grep -ci -m1 '^CONFIG_SOUNDCARD=justboom') ' {
# - Name displayed in YMPD sound button
var 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)
var target_bitdepth = '32'
var 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
}
#Grab our test music for the user.
Download_Test_Media
}
# Proftpd
setglobal INSTALLING_INDEX = '94'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#Samba Server
setglobal INSTALLING_INDEX = '96'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#vsFTPD
setglobal INSTALLING_INDEX = '95'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#NFS_SERVER
setglobal INSTALLING_INDEX = '109'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /etc/exports
$G_FP_DIETPI_USERDATA *(rw,async,no_root_squash,fsid=0,crossmnt,no_subtree_check)
"""
> /etc/exports
$G_FP_DIETPI_USERDATA *(rw,async,no_root_squash,fsid=0,crossmnt,no_subtree_check)
_EOF_
}
#YMPD
setglobal INSTALLING_INDEX = '32'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#YMPD service
cat << """ > /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
"""
> /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_
}
#Roon Bridge
setglobal INSTALLING_INDEX = '121'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#NodeRed
setglobal INSTALLING_INDEX = '122'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
mkdir -p "$G_FP_DIETPI_USERDATA"/node-red
adduser nodered --system --group --no-create-home --shell=/bin/nologin
cat << """ > /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
"""
> /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
}
#Tomcat8
setglobal INSTALLING_INDEX = '125'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
sed -i "/JAVA_HOME=/c\JAVA_HOME=$[find '/'usr'/'lib'/'jvm'/' -name java-8-openjdk*]" /etc/default/tomcat8
}
#CAVA
setglobal INSTALLING_INDEX = '119'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' ! $(cat /etc/mpd.conf | grep -ci -m1 '/tmp/mpd.fifo') ' {
cat << """ >> /etc/mpd.conf
#Cava fifo stream
audio_output {
type "fifo"
enabled "yes"
name "CAVA"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
"""
>> /etc/mpd.conf
#Cava fifo stream
audio_output {
type "fifo"
enabled "yes"
name "CAVA"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
_EOF_
}
}
#Mopidy
setglobal INSTALLING_INDEX = '118'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > ~/.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
"""
> ~/.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
}
#Kodi
setglobal INSTALLING_INDEX = '31'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#MINIDLNA
setglobal INSTALLING_INDEX = '39'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#NoIp
setglobal INSTALLING_INDEX = '67'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#noip2 service file
cat << """ > /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
"""
> /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_
}
#amiberry
setglobal INSTALLING_INDEX = '108'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > "$G_FP_DIETPI_USERDATA"/amiberry/floppy_images/dir.txt
Put your Amiga floopy images (*.adf) in this directory.
"""
> "$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 << """ > "$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
"""
> "$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 << """ > "$G_FP_DIETPI_USERDATA"/amiberry/savestates/dir.txt
Saved states will be stored here.
"""
> "$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 << """ > "$G_FP_DIETPI_USERDATA"/amiberry/screenshots/dir.txt
Screenshots will be stored here.
"""
> "$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:
var fp_userdata_actual = $[readlink $G_FP_DIETPI_USERDATA] # Only returns a value if symlink exists (eg: off SDcard)
if test -n $fp_userdata_actual {
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
}
#Symlink HW specific binary for this system to /etc/amiberry/amiberry
var amiberry_filename = ''amiberry-rpi''
# - RPi 3
if sh-expr ' $G_HW_MODEL == 3 ' {
set amiberry_filename = ''3''
# - RPi 2
} elif sh-expr ' $G_HW_MODEL == 2 ' {
set amiberry_filename = ''2''
# - Assume RPi 1 (ARMv6)
} else {
set amiberry_filename = ''1''
}
ln -sf /etc/amiberry/"$amiberry_filename" /etc/amiberry/amiberry
# + SDL2
set amiberry_filename = ''-sdl2''
ln -sf /etc/amiberry/"$amiberry_filename" /etc/amiberry/amiberry-sdl2
#service SDL1
cat << """ > /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
"""
> /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 << """ > /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
"""
> /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 << """ > /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
"""
> /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 << """ > /etc/amiberry/amiberry_run_sdl2.sh
#!/bin/bash
xinit ./amiberry-sdl2 -f conf/autostart.uae
"""
> /etc/amiberry/amiberry_run_sdl2.sh
#!/bin/bash
xinit ./amiberry-sdl2 -f conf/autostart.uae
_EOF_
chmod +x /etc/amiberry/amiberry_run_sdl2.sh
}
#dxx-rebirth
setglobal INSTALLING_INDEX = '112'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#OpenTyrian
setglobal INSTALLING_INDEX = '51'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#DIETPICAM
setglobal INSTALLING_INDEX = '59'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
var 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
}
#Deluge
setglobal INSTALLING_INDEX = '45'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > "$HOME"/.config/deluge/auth
root:$GLOBAL_PW:10
"""
> "$HOME"/.config/deluge/auth
root:$GLOBAL_PW:10
_EOF_
#Apply Optimized settings
# - Cache size is in steps of 16 KiB. (Cachesize * 16 = total KiB)
var deluge_cache_size = $shExpr(' $(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
}
#RaspControl
setglobal INSTALLING_INDEX = '106'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Setup login file
mkdir -p /etc/raspcontrol
cat << """ > /etc/raspcontrol/database.aptmnt
{
"user": "root",
"password": "$GLOBAL_PW"
}
"""
> /etc/raspcontrol/database.aptmnt
{
"user": "root",
"password": "$GLOBAL_PW"
}
_EOF_
chown -R www-data:www-data /etc/raspcontrol
chmod -R 750 /etc/raspcontrol
}
#PIHOLE
setglobal INSTALLING_INDEX = '93'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /var/www/index.html
Blocked by Pi-hole.
"""
> /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
}
#SUBSONIC 5/6
setglobal INSTALLING_INDEX = '34'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[33]} == 1 ||
${aSOFTWARE_INSTALL_STATE[34]} == 1 ' {
Banner_Configuration
#Optimize memory limit
var subsonic_memory_max = $shExpr(' $RAM_TOTAL / 5 ')
#Minimum cap 150mb
if sh-expr ' $subsonic_memory_max < 150 ' {
set subsonic_memory_max = '150'
}
cat << """ > /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"
"""
> /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 sh-expr ' $G_HW_MODEL < 2 ' {
ln -fs /usr/local/bin/ffmpeg /var/subsonic/transcode
#ARMv7
} else {
ln -fs /usr/bin/ffmpeg /var/subsonic/transcode
}
}
#WEBIOPI
setglobal INSTALLING_INDEX = '71'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#auto start
update-rc.d webiopi defaults
setglobal WEBIOPI = '2'
}
#DIETPICLOUDSHELL
setglobal INSTALLING_INDEX = '62'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Enable DietPi-Cloudshell autostart
/DietPi/dietpi/dietpi-autostart 5
#Service
cat << """ > /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
"""
> /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
}
#HAPROXY
setglobal INSTALLING_INDEX = '98'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Create jail directory
mkdir -p /var/lib/haproxy
cat << """ > /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
"""
> /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
var errorcode = '0'
set errorcode = '400'; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http
set errorcode = '403'; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http
set errorcode = '408'; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http
set errorcode = '500'; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http
set errorcode = '502'; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http
set errorcode = '503'; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http
set errorcode = '504'; echo -e "[html]$errorcode[/html]" > /etc/haproxy/errors/"$errorcode".http
}
#SQUEEZEBOXSERVER
setglobal INSTALLING_INDEX = '35'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#WORDPRESS
setglobal INSTALLING_INDEX = '55'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Create mysql DB
/DietPi/dietpi/func/create_mysql_db wordpress wordpress $GLOBAL_PW
}
#TIGHTVNCSERVER / VNC4SERVER / RealVNC - Shared setup
#INSTALLING_INDEX=27/28/120
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[27]} == 1 ||
${aSOFTWARE_INSTALL_STATE[28]} == 1 ||
${aSOFTWARE_INSTALL_STATE[120]} == 1 ' {
#Banner_Configuration
#User, enter PW
if sh-expr ' $G_USER_INPUTS ' {
var entering_pw = '1'
var loop_count = '0'
# - RealVNC uses Unix account
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[120]} == 1 ' {
set entering_pw = '0'
} else {
setglobal 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
}
while sh-expr ' $entering_pw == 1 ' {
vncpasswd
sh-expr 'loop_count++'
# - Password file created
if test -f "$HOME"/.vnc/passwd {
set entering_pw = '0'
# - Endless loop
} elif sh-expr ' $loop_count >= 30 ' {
set entering_pw = '0'
}
}
}
cat << """ > /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
"""
> /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 << """ > /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
"""
> /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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[120]} == 1 ' {
systemctl enable vncserver-x11-serviced.service
systemctl enable vncserver-virtuald.service
}
# - Stretch + TigerVNC: Disable Localhost only by default
if sh-expr ' $G_DISTRO >= 4 ' {
echo -e '$localhost = "no";' >> /etc/vnc.conf
}
}
#VNC4SERVER / RealVNC
setglobal INSTALLING_INDEX = '28'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} >= 1 ||
${aSOFTWARE_INSTALL_STATE[120]} >= 1 ' {
Banner_Configuration
var cmd_launch_desktop = ''''
#DESKTOP_LXDE
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[23]} >= 1 ' {
set cmd_launch_desktop = ''/usr/bin/lxsession -s LXDE &''
#DESKTOP_MATE
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[24]} >= 1 ' {
set cmd_launch_desktop = ''x-window-manager &''
#DESKTOP_GNUSTEP
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[26]} >= 1 ' {
set cmd_launch_desktop = ''x-window-manager &''
#DESKTOP_XFCE
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[25]} >= 1 ' {
set cmd_launch_desktop = ''/usr/bin/xfce4-session &''
}
mkdir -p "$HOME"/.vnc
cat << """ > "$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
"""
> "$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
}
#FAIL2BAN
setglobal INSTALLING_INDEX = '73'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# Generate log
echo 0 > /var/log/auth.log
cat << """ > /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
"""
> /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 << """ > /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
"""
> /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_
}
#PHPSYSINFO
setglobal INSTALLING_INDEX = '64'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#conf
cp /DietPi/dietpi/conf/phpsysinfo.ini /var/www/phpsysinfo/phpsysinfo.ini
}
#PHPIMAGEGALLERY
setglobal INSTALLING_INDEX = '56'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#AMPACHE
setglobal INSTALLING_INDEX = '40'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#OPENVPNSERVER
setglobal INSTALLING_INDEX = '97'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
var key_size = '1024'
#Start Cert/Key generation.
cp -R /usr/share/easy-rsa/ /etc/openvpn
mkdir -p /etc/openvpn/easy-rsa/keys
cat << """ >> /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"
"""
>> /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
source ./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 << """ > /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"
"""
> /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 << """ > /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
"""
> /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
}
#WIFIHOTSPOT
setglobal INSTALLING_INDEX = '60'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
var eth_index = $[sed -n 1p /DietPi/dietpi/.network]
var wifi_index = $[sed -n 2p /DietPi/dietpi/.network]
# - DHCPD Config
cat << """ > /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;
}
"""
> /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 << """ > /etc/default/isc-dhcp-server
INTERFACES="wlan$wifi_index"
"""
> /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 << """ >> /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
"""
>> /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 << """ > /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
"""
> /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 sh-expr ' $WIFIHOTSPOT_RTL8188C_DEVICE ' {
sed -i "/^driver=/c\driver=rtl871xdrv" /etc/hostapd/hostapd.conf
}
# - Enable access point config
cat << """ > /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"
"""
> /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 sh-expr ' $G_HW_MODEL == 3 && ! $WIFIHOTSPOT_RTL8188C_DEVICE ' {
# - Add Wireless N support
echo -e "ieee80211n=1" >> /etc/hostapd/hostapd.conf
}
}
#TORHOTSPOT
setglobal INSTALLING_INDEX = '61'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - Tor config
cat << """ > /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
"""
> /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
var 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
}
#SHAIRPORTSYNC
setglobal INSTALLING_INDEX = '37'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Enable SOXR by default:
cat << """ > /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"
};
"""
> /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
}
#BRUTEFIR
setglobal INSTALLING_INDEX = '38'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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"
}
"""
> /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_
}
#PYDIO
setglobal INSTALLING_INDEX = '48'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
var 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
}
#SQUEEZELITE
setglobal INSTALLING_INDEX = '36'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#EMONHUB
setglobal INSTALLING_INDEX = '99'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_HW_MODEL == 3 ' {
# - Add DToverlay to disable bluetooth
if sh-expr ' $(cat /DietPi/config.txt | grep -ci -m1 '=pi3-disable-bt') == 0 ' {
echo -e "\ndtoverlay=pi3-disable-bt" >> /DietPi/config.txt
# - Enable
} else {
sed -i '/pi3-disable-bt/c\dtoverlay=pi3-disable-bt' /DietPi/config.txt
}
# - Disable bluetooth service
systemctl stop hciuart
systemctl disable hciuart
}
#RPi - Disable serial tty that emonPi uses.
/DietPi/dietpi/func/dietpi-set_hardware serialconsole disable
# - Apply user API KEY
setglobal 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
}
#RPIMONITOR
setglobal INSTALLING_INDEX = '66'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - Update apt package stats
/usr/share/rpimonitor/scripts/updatePackagesStatus.pl
# - USBdrive stats implimentation by Rich
if sh-expr ' $USBDRIVE ' {
sed -i '\/include=\/etc\/rpimonitor\/template\/sdcard.conf/a include=\/etc\/rpimonitor\/template\/usb_hdd.conf' /etc/rpimonitor/data.conf
cat << """ > /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"
"""
> /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_
}
}
#NETDATA
setglobal INSTALLING_INDEX = '65'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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] {
chown -R netdata.netdata $x
chmod 0775 -R $x
}
}
#BAIKAL
setglobal INSTALLING_INDEX = '57'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#MUMBLESERVER
setglobal INSTALLING_INDEX = '43'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Cap total connections
var max_users = $shExpr(' $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
}
#EMBYSERVER
setglobal INSTALLING_INDEX = '41'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
Download_Test_Media
}
#PLEXMEDIASERVER
setglobal INSTALLING_INDEX = '42'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 sh-expr ' $G_USER_INPUTS &&
$G_HW_ARCH < 10 && ! $(locale | grep -ci -m1 'en_US.UTF-8') ' {
sed -i '/en_US.UTF-8 UTF-8/c\en_US.UTF-8 UTF-8' /etc/locale.gen
locale-gen
setglobal 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
}
}
#CUBERITE
setglobal INSTALLING_INDEX = '52'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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 << """ > /etc/cubrite/webadmin.ini
[User:root]
Password=$GLOBAL_PW
[WebAdmin]
Ports=1339
Enabled=1
"""
> /etc/cubrite/webadmin.ini
[User:root]
Password=$GLOBAL_PW
[WebAdmin]
Ports=1339
Enabled=1
_EOF_
}
#MINEOS
setglobal INSTALLING_INDEX = '53'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#GOGS
setglobal INSTALLING_INDEX = '49'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /etc/gogs/start.sh
#!/bin/bash
#Simple script to start gogs for DietPi systems
/etc/gogs/gogs web &> /var/log/gogs_daemon.log &
exit
"""
> /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 << """ > /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
"""
> /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_
}
#QBITTORRENT
setglobal INSTALLING_INDEX = '46'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - conf.
mkdir -p "$HOME"/.config/qBittorrent
cat << """ > "$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=
"""
> "$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 << """ > /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
"""
> /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
}
#RTORRENT
setglobal INSTALLING_INDEX = '107'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Create username/password for rutorrent based on webserver type.
# - Apache2
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[83]} >= 1 ' {
# - 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 << """ > /var/www/rutorrent/.htaccess
AuthUserFile /etc/.rutorrent-htaccess
AuthName "ruTorrent_login"
AuthType Basic
require user root
"""
> /var/www/rutorrent/.htaccess
AuthUserFile /etc/.rutorrent-htaccess
AuthName "ruTorrent_login"
AuthType Basic
require user root
_EOF_
cat << """ > /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
"""
> /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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[84]} >= 1 ' {
echo -e "root:rtorrent:$[echo -n "root:rtorrent:dietpi" | md5sum | cut -b -32]" > /etc/.rutorrent-htaccess
# - add to /etc/lighttpd/lighttpd.conf
if sh-expr ' ! $(cat /etc/lighttpd/lighttpd.conf | grep -ci -m1 '^#RUTORRENT_DIETPI') ' {
cat << """ >> /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
"""
>> /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_
}
# - Nginx
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[85]} >= 1 ' {
echo "root:$[openssl passwd -crypt dietpi]" > /etc/.rutorrent-htaccess
cat << """ > /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;
}
"""
> /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_
}
# - 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 << """ > /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
"""
> /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 << """ > "$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 = $shExpr(' $(Optimize_BitTorrent 0) * 1024 * 1024 ')
# Maximum and minimum number of peers to connect to per torrent.
min_peers = 1
max_peers = $shExpr(' $(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
"""
> "$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_
}
#Aria2
setglobal INSTALLING_INDEX = '132'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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_
}
#SYNCTHING
setglobal INSTALLING_INDEX = '50'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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
"""
> /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
}
#Urbackup server
setglobal INSTALLING_INDEX = '111'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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'"
}
#SICKRAGE
setglobal INSTALLING_INDEX = '116'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
mkdir -p "$G_FP_DIETPI_USERDATA"/sickrage
cat << """ > /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
"""
> /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.
var max_loops = '10'
var current_loop = '0'
while [ ! -f "$G_FP_DIETPI_USERDATA/sickrage/config.ini" ]
{
G_DIETPI-NOTIFY 2 "Waiting for SickRage to finish 1st run prep, please wait..."
sleep 1
sh-expr 'current_loop++'
if sh-expr ' $current_loop >= $max_loops ' {
G_DIETPI-NOTIFY 1 "Timed-out waiting for SickRage to generate config.ini"
break
}
}
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
}
#TONIDO
setglobal INSTALLING_INDEX = '134'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#service
cat << """ > /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
"""
> /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 sh-expr ' $G_HW_ARCH == 2 ' {
sed -i 's/armv6l/armv7l/' /etc/tonido/manifest.xml
sed -i 's/armv6l/armv7l/' /etc/tonido/plugins/*/manifest.xml
}
}
#Chromium
setglobal INSTALLING_INDEX = '113'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Allow root, start maximized and disable sandbox under root (blank screen without)
var export_options = '"export CHROMIUM_FLAGS=\"\$CHROMIUM_FLAGS --no-sandbox --temp-profile --start-maximized --user-data-dir '"
#RPi
if sh-expr ' $G_HW_MODEL < 10 ' {
# OpenGL
if sh-expr ' $G_HW_MODEL >= 2 ' {
#Hangs xinit: https://github.com/Fourdee/DietPi/issues/834
#/DietPi/dietpi/func/dietpi-set_hardware rpi-opengl enable
echo 0
}
#OpenGL
} elif sh-expr ' $G_HW_MODEL == 21 ' {
echo 0 &> /dev/null
#GLES
} else {
set export_options = ''--use-gl=egl''
}
set export_options = '"'\""
mkdir -p /etc/chromium.d
cat << """ > /etc/chromium.d/custom_flags
$export_options
"""
> /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
}
#OMV
setglobal INSTALLING_INDEX = '126'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
omv-initsystem
}
#O!MPD
setglobal INSTALLING_INDEX = '129'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#IceCast + DarkIce
setglobal INSTALLING_INDEX = '135'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
var 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
var input_device_index = $[arecord -l | grep -m1 'card' | awk '{print $2}' | sed 's/://]
cat << """ > /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
"""
> /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 << """ > /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
"""
> /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_
}
#Blynk
setglobal INSTALLING_INDEX = '131'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - service
var fp_java_binary = $[which java]
mkdir -p "$G_FP_DIETPI_USERDATA"/blynk
setglobal 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 << """ > /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
"""
> /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_
}
#MotionEye
setglobal INSTALLING_INDEX = '136'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
#Enable RPi cam
if sh-expr ' $G_HW_MODEL < 10 ' {
/DietPi/dietpi/func/dietpi-set_hardware rpi-camera enable
}
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
}
#CloudPrint
setglobal INSTALLING_INDEX = '137'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - Enable web admin
cupsctl --remote-admin
usermod -a -G lpadmin root
}
#VirtualHere
setglobal INSTALLING_INDEX = '138'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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
}
#SABnzbd
setglobal INSTALLING_INDEX = '139'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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 ]
{
sleep 1
}
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
}
#spotifyconnectweb
setglobal INSTALLING_INDEX = '141'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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_
}
#couchpotato
setglobal INSTALLING_INDEX = '142'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#Koel
setglobal INSTALLING_INDEX = '143'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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
"""
> /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_
}
#Sonarr
setglobal INSTALLING_INDEX = '144'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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_
}
#Radarr
setglobal INSTALLING_INDEX = '145'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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_
}
#PlexPy
setglobal INSTALLING_INDEX = '146'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
mkdir -p "$G_FP_DIETPI_USERDATA"/plexpy
cat << """ > /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
"""
> /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_
}
#Jackett
setglobal INSTALLING_INDEX = '147'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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_
}
#NZBget
setglobal INSTALLING_INDEX = '149'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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
"""
> /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_
}
#HTPC Manager
setglobal INSTALLING_INDEX = '155'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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_
}
#OctoPrint
setglobal INSTALLING_INDEX = '153'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /etc/systemd/system/octoprint.service
[Unit]
Description=OctoPrint
[Service]
Type=simple
User=root
ExecStart=$[which octoprint] serve --iknowwhatimdoing
[Install]
WantedBy=multi-user.target
"""
> /etc/systemd/system/octoprint.service
[Unit]
Description=OctoPrint
[Service]
Type=simple
User=root
ExecStart=$(which octoprint) serve --iknowwhatimdoing
[Install]
WantedBy=multi-user.target
_EOF_
}
#RoonServer
setglobal INSTALLING_INDEX = '154'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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_
}
#Steam
setglobal INSTALLING_INDEX = '156'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#------------------ Home Automation: Home Assistant ------------------
setglobal INSTALLING_INDEX = '157'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cat << """ > /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
"""
> /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
}
#-------------------------------------------------------------------
#Minio Config
setglobal INSTALLING_INDEX = '158'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# Create simple mandatory default configuration file
cat << """ >> /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
"""
>> /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
}
#Docker Config
setglobal INSTALLING_INDEX = '162'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
#-------------------------------------------------------------------
#FuguHub Config
setglobal INSTALLING_INDEX = '161'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# Setup Filestore DietPi appropriate
# IF already present just create symlink
if test ! -f "$G_FP_DIETPI_USERDATA"/fuguhub-data/ {
# 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
}
}
#-------------------------------------------------------------------
#Nukkit Config
setglobal INSTALLING_INDEX = '164'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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
"""
> /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_
}
#GITEA Config
setglobal INSTALLING_INDEX = '165'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
# - service
cat << """ > /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
"""
> /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
}
#Allo Config
setglobal INSTALLING_INDEX = '159' #160 for quick reinstall/update
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ||
${aSOFTWARE_INSTALL_STATE[160]} == 1 ' {
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 << """ > /var/www/index.php
"""
> /var/www/index.php
_EOF_
#HW specific changes
# - SPARKY ONLY - Auto detect eth adapter
if sh-expr ' $G_HW_MODEL == 70 ' {
# - Disable onboard ETH if adapter found
cat << """ > /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
"""
> /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 << """ > /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
"""
> /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
}
# - Allow for quick updates with 160 reinstall
aSOFTWARE_INSTALL_STATE[160]=2
}
#Gmediarender
setglobal INSTALLING_INDEX = '163'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
cp /DietPi/dietpi/conf/gmrender.service /etc/systemd/system/gmrender.service
}
#AudioPhonics Pi-SPC
setglobal INSTALLING_INDEX = '166'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
Banner_Configuration
mkdir -p /var/lib/dietpi/dietpi-software/installed/pi-spc
cat << """ > /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
"""
> /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 << """ > /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
"""
> /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_
}
#moOde Configuration
setglobal INSTALLING_INDEX = '168'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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 << """ > /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
"""
> /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 -------------------------------------------------------------------
}
#Google AIY
setglobal INSTALLING_INDEX = '169'
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$INSTALLING_INDEX]} == 1 ' {
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
}
}
proc Install_Apply_GPU_Settings{
var gpu_enabled = '0'
var gpu_memory = '0'
#Define Memory Split Modes with installed software
#Mode 4 RPI ONLY (Descent HIGH GPU RAM / 192MB)
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[112]} == 2 ' {
set gpu_enabled = '1'
set gpu_memory = '192'
#Define Memory Split Modes with installed software
#Mode 3 (KODI / DIETPICAM / UAE4ARM / JRiver / MED GPU RAM / 128MB)
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[31]} == 2 ||
${aSOFTWARE_INSTALL_STATE[59]} == 2 ||
${aSOFTWARE_INSTALL_STATE[108]} == 2 ||
${aSOFTWARE_INSTALL_STATE[148]} == 2 ' {
set gpu_enabled = '1'
set gpu_memory = '128'
#Mode 2 (Desktop / LOW GPU RAM)
#All DESKTOP_* and OPENTYRIAN
} elif sh-expr ' ${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 ' {
set gpu_enabled = '1'
set gpu_memory = '64'
#Mode 1 - DIETPICLOUDSHELL (forces display output)
} elif sh-expr ' ${aSOFTWARE_INSTALL_STATE[62]} == 2 ' {
set gpu_enabled = '1'
}
#Apply
if sh-expr ' $gpu_memory > 0 ' {
#RPi
if sh-expr ' $G_HW_MODEL < 10 ' {
/DietPi/dietpi/func/dietpi-set_hardware gpumemsplit $gpu_memory
}
}
if sh-expr ' $gpu_enabled ' {
#RPi
if sh-expr ' $G_HW_MODEL < 10 ' {
sed -i "/CONFIG_HDMI_OUTPUT=/c\CONFIG_HDMI_OUTPUT=1" /DietPi/dietpi.txt
#odroid C1
} elif sh-expr ' $G_HW_MODEL == 10 ' {
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 sh-expr ' $G_HW_MODEL == 12 ' {
sed -i '/setenv nographics /c\setenv nographics "0"' /DietPi/boot.ini
}
}
}
proc Check_USB_Drive_Installed{
setglobal USBDRIVE = '0'
setglobal FP_DIETPI_DEDICATED_USBDRIVE = $[df -P | grep -m1 '^/dev/sda1' | awk '{print $6}]
#Only enable if mounted
if test -n $FP_DIETPI_DEDICATED_USBDRIVE &&
sh-expr ' $(df -P | grep -ci -m1 "$FP_DIETPI_DEDICATED_USBDRIVE") ' {
setglobal USBDRIVE = '1'
}
}
proc Uninstall_Software{
#NB: systemctl daemon-reload is executed after this func in Uninstall_Software_Finalize()
var 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?
var valid_input = '1'
#----------------------------------------------------------------------
#DIETPI SOFTWARE
if sh-expr ' $index == 100 ' {
setglobal 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 sh-expr ' $index == 23 ' {
G_AGP lxde lxde-* upower policykit-1 iceweasel p7zip-full
} elif sh-expr ' $index == 24 ' {
G_AGP mate-desktop-environment-extras upower policykit-1 iceweasel p7zip-full
} elif sh-expr ' $index == 26 ' {
G_AGP x-window-system-core wmaker gnustep gnustep-devel gnustep-games upower policykit-1 iceweasel p7zip-full
} elif sh-expr ' $index == 25 ' {
G_AGP xfce4 gnome-icon-theme tango-icon-theme iceweasel p7zip-full
} elif sh-expr ' $index == 22 ' {
G_AGP quiterss
} elif sh-expr ' $index == 30 ' {
G_RUN_CMD dpkg -P nomachine
} elif sh-expr ' $index == 29 ' {
G_AGP xrdp
} elif sh-expr ' $index == 44 ' {
G_AGP transmission-daemon
rm /etc/init.d/transmission-daemon &> /dev/null
rm /etc/systemd/system/transmission-daemon.service &> /dev/null
} elif sh-expr ' $index == 47 ' {
#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."
var datadir = $[grep -m1 "'datadirectory'" /var/www/owncloud/config/config.php | awk '{print $3}' | sed "s/[',]//g]
test -n $datadir || set 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
test -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 sh-expr ' $index == 114 ' {
#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."
var datadir = $[grep -m1 "'datadirectory'" /var/www/nextcloud/config/config.php | awk '{print $3}' | sed "s/[',]//g]
test -n $datadir || set 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
test -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 sh-expr ' $index == 83 ' {
G_AGP apache2
} elif sh-expr ' $index == 85 ' {
G_AGP nginx
} elif sh-expr ' $index == 84 ' {
G_AGP lighttpd
} elif sh-expr ' $index == 88 ' {
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 sh-expr ' $index == 87 ' {
G_AGP sqlite3
} elif sh-expr ' $index == 91 ' {
G_AGP "$PHP_APT_PACKAGE_NAME"-redis redis-server redis-tools
} elif sh-expr ' $index == 89 ' {
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 sh-expr ' $index == 90 ' {
systemctl start mysql
mysqladmin drop phpmyadmin -f
mysql -e "drop user 'phpmyadmin'@'localhost'"
G_AGP phpmyadmin
} elif sh-expr ' $index == 54 ' {
systemctl start mysql
mysqladmin drop phpbb3 -f
mysql -e "drop user phpbb3@localhost"
rm -R /var/www/phpBB3
} elif sh-expr ' $index == 115 ' {
G_RUN_CMD dpkg -P webmin
} elif sh-expr ' $index == 32 ' {
rm /usr/bin/ympd
rm /etc/systemd/system/ympd.service
} elif sh-expr ' $index == 128 ' {
#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
sh-expr ' $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 sh-expr ' $index == 121 ' {
rm /etc/systemd/system/roonbridge.service
rm -R /etc/roonbridge
} elif sh-expr ' $index == 122 ' {
rm /etc/systemd/system/node-red.service
rm "$HOME"/.node-red
rm -R "$G_FP_DIETPI_USERDATA"/node-red
userdel -f nodered
} elif sh-expr ' $index == 123 ' {
if sh-expr ' $G_DISTRO > 4 ' {
G_AGP mosquitto
} else {
#apt-mark auto libssl1.0.0
dpkg -P mosquitto
}
} elif sh-expr ' $index == 124 ' {
#apt-mark auto gcc-6-base libstdc++6 &> /dev/null
G_RUN_CMD dpkg -P networkaudiod
} elif sh-expr ' $index == 125 ' {
G_AGP tomcat8
} elif sh-expr ' $index == 126 ' {
G_AGP openmediavault
rm /etc/apt/sources.list.d/openmediavault.list
} elif sh-expr ' $index == 129 ' {
rm -R /var/www/ompd
systemctl start mysql
mysqladmin drop ompd -f
mysql -e "drop user ompd@localhost"
} elif sh-expr ' $index == 130 ' {
G_AGP python-pip python3-pip
} elif sh-expr ' $index == 131 ' {
rm /etc/systemd/system/blynkserver.service
rm -R /etc/blynkserver
} elif sh-expr ' $index == 132 ' {
rm /etc/systemd/system/aria2.service
rm /usr/local/bin/aria2c
rm -R /var/www/aria2
G_AGP aria2
} elif sh-expr ' $index == 133 ' {
rm /etc/systemd/system/yacy.service
rm -R /etc/yacy
} elif sh-expr ' $index == 134 ' {
#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 sh-expr ' $index == 135 ' {
G_AGP darkice icecast2
rm /etc/systemd/system/darkice.service
} elif sh-expr ' $index == 136 ' {
#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
sh-expr ' $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 sh-expr ' $index == 137 ' {
G_AGP cloudprint-service
if sh-expr ' $G_DISTRO == 3 ' {
rm /etc/apt/sources.list.d/cloudprint.list
G_AGUP
}
} elif sh-expr ' $index == 138 ' {
rm -R /etc/vhusbd
rm /etc/systemd/system/virtualhere.service
} elif sh-expr ' $index == 139 ' {
rm -R /etc/sabnzbd
rm /etc/systemd/system/sabnzbd.service
} elif sh-expr ' $index == 140 ' {
G_RUN_CMD dpkg -P libsdl2 libsdl2-image libsdl2-mixer libsdl2-net libsdl2-ttf libsmpeg2
} elif sh-expr ' $index == 141 ' {
rm -R "$G_FP_DIETPI_USERDATA"/spotify-connect-web
rm /etc/systemd/system/spotify-connect-web.service
} elif sh-expr ' $index == 142 ' {
rm -R /etc/couchpotato
rm -R "$G_FP_DIETPI_USERDATA"/couchpotato
rm /etc/init.d/couchpotato
#userdel -f couchpotato
} elif sh-expr ' $index == 143 ' {
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 sh-expr ' $index == 144 ' {
G_AGP nzbdrone
rm /etc/systemd/system/sonarr.service
rm /etc/apt/sources.list.d/sonarr.list
G_AGUP
} elif sh-expr ' $index == 145 ' {
rm -R /opt/Radarr
rm /etc/systemd/system/radarr.service
} elif sh-expr ' $index == 146 ' {
rm -R /opt/plexpy
rm -R "$G_FP_DIETPI_USERDATA"/plexpy
rm /etc/systemd/system/plexpy.service
} elif sh-expr ' $index == 147 ' {
rm -R /opt/jackett
rm /etc/systemd/system/jackett.service
} elif sh-expr ' $index == 148 ' {
G_AGP mediacenter22
} elif sh-expr ' $index == 149 ' {
rm -R "$G_FP_DIETPI_USERDATA"/nzbget
rm /etc/systemd/system/nzbget.service
} elif sh-expr ' $index == 155 ' {
rm -R "$G_FP_DIETPI_USERDATA"/htpc-manager
rm /etc/systemd/system/htpc-manager.service
} elif sh-expr ' $index == 150 ' {
#G_AGP mono-runtime #shared lib
rm /etc/apt/sources.list.d/mono-xamarin.list
G_AGUP
} elif sh-expr ' $index == 151 ' {
G_AGP nvidia-driver nvidia-xconfig libgl1-nvidia-glx:i386
} elif sh-expr ' $index == 152 ' {
G_AGP avahi-daemon
} elif sh-expr ' $index == 153 ' {
rm -R "$G_FP_DIETPI_USERDATA"/octoprint
rm $[which octoprint]
rm -R "$HOME"/.octoprint
rm /etc/systemd/system/octoprint.service
} elif sh-expr ' $index == 154 ' {
rm -R "$G_FP_DIETPI_USERDATA"/roonserver
rm /etc/systemd/system/roonserver.service
} elif sh-expr ' $index == 156 ' {
G_AGP steam
rm -R "$HOME"/.steam
rm -R "$G_FP_DIETPI_USERDATA"/steam
} elif sh-expr ' $index == 119 ' {
G_AGP cava
rm "$HOME/.config/cava/config"
rm "$HOME/cava.psf"
} elif sh-expr ' $index == 118 ' {
G_AGP mopidy
rm /etc/apt/sources.list.d/mopidy.list
pip uninstall -y Mopidy-MusicBox-Webclient Mopidy-Local-Images
} elif sh-expr ' $index == 31 ' {
G_AGP kodi
#+Odroids
G_AGP kodi-odroid
rm /usr/share/applications/kodi.desktop
rm ~/Desktop/kodi.desktop
} elif sh-expr ' $index == 39 ' {
G_AGP minidlna
} elif sh-expr ' $index == 51 ' {
G_AGP ibsdl1.2debian libsdl-net1.2
rm -R /usr/local/games/opentyrian
rm /usr/share/applications/opentyrian.desktop
rm ~/Desktop/opentyrian.desktop
} elif sh-expr ' $index == 59 ' {
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 sh-expr ' $index == 45 ' {
G_AGP deluged deluge-web deluge-webui deluge-console
rm /var/lib/dietpi/dietpi-software/services/deluge.service
rm -R ~/.config/deluge
} elif sh-expr ' $index == 94 ' {
G_AGP proftpd-basic
} elif sh-expr ' $index == 96 ' {
G_AGP samba samba-common-bin
} elif sh-expr ' $index == 95 ' {
G_AGP vsftpd
} elif sh-expr ' $index == 109 ' {
G_AGP nfs-kernel-server
} elif sh-expr ' $index == 67 ' {
rm /usr/local/bin/noip2
rm /etc/systemd/system/noip2.service
} elif sh-expr ' $index == 106 ' {
rm -R /var/www/raspcontrol
rm -R /etc/raspcontrol
} elif sh-expr ' $index == 63 ' {
rm -R /var/www/linuxdash
} elif sh-expr ' $index == 93 ' {
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 sh-expr ' $index == 33 || $index == 34 ' {
G_RUN_CMD dpkg -P subsonic
rm -R /var/subsonic
} elif sh-expr ' $index == 71 ' {
update-rc.d webiopi remove
rm -R /etc/webiopi
rm -R /usr/share/webiopi
rm /usr/bin/webiopi
rm /etc/init.d/webiopi
} elif sh-expr ' $index == 68 ' {
# <= 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 sh-expr ' $index == 62 ' {
#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 sh-expr ' $index == 98 ' {
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 sh-expr ' $index == 35 ' {
#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 sh-expr ' $index == 55 ' {
systemctl start mysql
mysqladmin drop wordpress -f
mysql -e "drop user wordpress@localhost"
rm -R /var/www/wordpress
} elif sh-expr ' $index == 27 || $index == 28 || $index == 120 ' {
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 sh-expr ' $index == 73 ' {
G_AGP fail2ban
} elif sh-expr ' $index == 64 ' {
rm -R /var/www/phpsysinfo
} elif sh-expr ' $index == 56 ' {
rm /var/www/gallery/index.php
rm -R /var/www/gallery/_sfpg_data
} elif sh-expr ' $index == 40 ' {
rm -R /var/www/ampache
#drop database
systemctl start mysql
mysqladmin drop ampache -f
mysql -e "drop user ampache@localhost"
} elif sh-expr ' $index == 117 ' {
rm /etc/apt/sources.list.d/swupdate.openvpn.net.list
pivpn -u
userdel -f pivpn
} elif sh-expr ' $index == 97 ' {
G_AGP openvpn
rm -R /etc/openvpn &> /dev/null
} elif sh-expr ' $index == 92 ' {
if sh-expr ' $G_DISTRO >= 4 ' {
G_AGP python-certbot-apache python-certbot-nginx certbot
}
rm -R /etc/letsencrypt_scripts &>/dev/null
rm -R /etc/certbot_scripts &>/dev/null
} elif sh-expr ' $index == 69 ' {
G_AGP python-rpi.gpio python3-rpi.gpio
} elif sh-expr ' $index == 72 ' {
G_AGP i2c-tools
#Disable
/DietPi/dietpi/func/dietpi-set_hardware i2c disable
} elif sh-expr ' $index == 70 ' {
rm -R /root/wiringPi* &> /dev/null
} elif sh-expr ' $index == 60 ' {
#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.
var 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 << """ >> /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
"""
>> /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 sh-expr ' $index == 61 ' {
G_AGP tor
# - uninstall WIFIHOTSPOT ALSO. Due to IPtables needing reset.
Uninstall_Software 60
} elif sh-expr ' $index == 37 ' {
#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 sh-expr ' $index == 38 ' {
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 sh-expr ' $index == 48 ' {
rm -R /var/www/pydio
#drop database
systemctl start mysql
mysqladmin drop pydio -f
mysql -e "drop user pydio@localhost"
} elif sh-expr ' $index == 36 ' {
G_AGP squeezelite
rm -R /usr/bin/squeezelite*
rm /etc/systemd/system/squeezelite.service
} elif sh-expr ' $index == 99 ' {
rm -R /etc/emonhub
rm /etc/init.d/emonhub
rm /etc/default/emonhub
} elif sh-expr ' $index == 66 ' {
G_RUN_CMD dpkg -P rpimonitor
} elif sh-expr ' $index == 57 ' {
rm -R /var/www/baikal
#drop database
systemctl start mysql
mysqladmin drop baikal -f
mysql -e "drop user baikal@localhost"
} elif sh-expr ' $index == 65 ' {
#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 sh-expr ' $index == 43 ' {
G_AGP mumble-server
} elif sh-expr ' $index == 41 ' {
G_AGP emby-server embymagick
rm /etc/apt/sources.list.d/emby-server.list
G_AGUP
} elif sh-expr ' $index == 58 ' {
rm -R /etc/openbazaar-server
rm /etc/systemd/system/openbazaar.service
} elif sh-expr ' $index == 42 ' {
sh-expr ' $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 sh-expr ' $index == 52 ' {
rm -R /etc/cuberite
rm /etc/systemd/system/cuberite.service
} elif sh-expr ' $index == 53 ' {
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 sh-expr ' $index == 49 ' {
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 sh-expr ' $index == 46 ' {
G_AGP qbittorrent-nox
rm /etc/systemd/system/qbittorrent.service
rm -R "$HOME"/.config/qBittorrent
} elif sh-expr ' $index == 50 ' {
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 sh-expr ' $index == 116 ' {
rm /etc/systemd/system/sickrage.service
rm -R /etc/sickrage
} elif sh-expr ' $index == 107 ' {
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 sh-expr ' $index == 108 ' {
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 sh-expr ' $index == 112 ' {
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 sh-expr ' $index == 113 ' {
#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
sh-expr ' $G_DISTRO >=4 ' && G_AGP chromium* || G_RUN_CMD dpkg -P chromium chromedriver
} elif sh-expr ' $index == 157' {
# 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 sh-expr ' $index == 165 ' {
# 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 sh-expr ' $index == 166 ' {
rm /etc/systemd/system/pi-spc.service
rm -R /var/lib/dietpi/dietpi-software/installed/pi-spc
} elif sh-expr ' $index == 167 ' {
G_AGP raspotify
rm /etc/apt/sources.list.d/raspotify.list
G_AGUP
} elif sh-expr ' $index == 168 ' {
echo -e "pending"
} elif sh-expr ' $index == 169 ' {
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 sh-expr ' $index == 170 ' {
Reset_NTPD
G_AGP ntp
} elif sh-expr ' $index == 158 ' {
# 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 sh-expr ' $index == 161 ' {
/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 sh-expr ' $index == 162 ' {
if sh-expr ' $G_HW_ARCH == 10 ' {
# 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
}
# delete data files - dietpi
rm -r "$G_FP_DIETPI_USERDATA"/docker-data
# remove default unused folder
rm -r /var/lib/docker
} elif sh-expr ' $index == 164 ' {
# Remove Service file
rm /etc/systemd/system/nukkit.service
# remove nukkit java file/folder
rm -r /usr/local/bin/nukkit
} elif sh-expr ' $index == 163 ' {
#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 sh-expr ' $index == 159 || $index == 160 ' {
rm -R /var/www/allo
systemctl start mysql
mysqladmin drop allo_db -f
mysql -e "drop user allo_db@localhost"
#----------------------------------------------------------------------
#LINUX SOFTWARE
} elif sh-expr ' $index == 15 ' {
G_AGP tcpdump
} elif sh-expr ' $index == 14 ' {
G_AGP nload
} elif sh-expr ' $index == 13 ' {
G_AGP mtr-tiny
} elif sh-expr ' $index == 11 ' {
G_AGP iptraf
} elif sh-expr ' $index == 10 ' {
G_AGP iftop
} elif sh-expr ' $index == 19 ' {
G_AGP jed
} elif sh-expr ' $index == 3 ' {
G_AGP mc
} elif sh-expr ' $index == 18 ' {
G_AGP emacs
} elif sh-expr ' $index == 20 || $i == 21 ' {
G_AGP vim vim-tiny
} elif sh-expr ' $index == 127 ' {
G_AGP neovim
} elif sh-expr ' $index == 0 ' {
#This also removes OpenSSH server. So lets check OpenSSH server isnt installed before hand.
if sh-expr ' $(dpkg -l | grep -ci -m1 'openssh-server') == 0 ' {
G_AGP openssh-client
}
} elif sh-expr ' $index == 1 ' {
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 sh-expr ' $index == 111 ' {
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 sh-expr ' $index == 110 ' {
umount -f /mnt/nfs_client
#nfs-kernel-server depends on nfs-common
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[109]} == 0 ' {
G_AGP nfs-common
}
#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 sh-expr ' $index == 16 ' {
G_AGP build-essential
} elif sh-expr ' $index == 17 ' {
G_AGP git
} elif sh-expr ' $index == 5 ' {
G_AGP alsa-utils
} elif sh-expr ' $index == 6 ' {
#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 sh-expr ' $index == 2 ' {
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 sh-expr ' $index == 7 ' {
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
sh-expr ' $G_HW_MODEL < 10 ' && G_RUN_CMD dpkg -P libx264 libmp3lame libfdk-aac
} elif sh-expr ' $index == 8 ' {
G_AGP openjdk-8-jdk
rm /etc/apt/preferences.d/99-dietpi-openjdk-8-jdk &> /dev/null
} elif sh-expr ' $index == 104 ' {
G_AGP dropbear* #stretch | dropbear-initramfs dropbear-run
} elif sh-expr ' $index == 105 ' {
G_AGP openssh-*
# This also clears Openssh-client
aSOFTWARE_INSTALL_STATE[0]=0
} elif sh-expr ' $index == 103 ' {
sed -i '/\/var\/log/c\#\/var\/log DietPi Ramlog Disabled' /etc/fstab
} elif sh-expr ' $index == 101 ' {
G_AGP logrotate
} elif sh-expr ' $index == 102 ' {
G_AGP rsyslog
} elif sh-expr ' $index == 9 ' {
G_AGP nodejs
# - old install via repo
if test -f /etc/apt/sources.list.d/nodesource_nodejs.list {
rm /etc/apt/sources.list.d/nodesource_nodejs.list
G_AGUP
}
rm /usr/local/bin/node
} elif sh-expr ' $index == 4 ' {
G_AGP vifm
} else {
G_DIETPI-NOTIFY 2 "Software index $index is unknown, or, has no removal code."
set valid_input = '0'
}
#----------------------------------------------------------------------
#log to .uninstalled file
if test ! -f /DietPi/dietpi/.uninstalled {
echo -e "DietPi Uninstall Software Log\n----------------------\n" > /DietPi/dietpi/.uninstalled
}
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
#----------------------------------------------------------------------
}
proc 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
var fp_temp = ''/tmp/.dietpi-uninstall_dpkg''
dpkg --get-selections | awk '{print $1}' > $fp_temp
if sh-expr ' ! $(grep -ci -m1 '^openssh-server' "$fp_temp") &&
! $(grep -ci -m1 '^dropbear' "$fp_temp") ' {
setglobal INDEX_SSHSERVER_CURRENT = '0'
setglobal INDEX_SSHSERVER_TARGET = '0'
}
if sh-expr ' ! $(grep -ci -m1 '^samba$' "$fp_temp") &&
! $(grep -ci -m1 '^proftpd-basic' "$fp_temp") ' {
setglobal INDEX_FILESERVER_CURRENT = '0'
setglobal INDEX_FILESERVER_TARGET = '0'
}
if sh-expr ' $(grep -ci -m1 '#/var/log' /etc/fstab) &&
! $(grep -ci -m1 '^rsyslog' "$fp_temp") &&
! $(grep -ci -m1 '^logrotate' "$fp_temp") ' {
setglobal INDEX_LOGGING_CURRENT = '0'
setglobal INDEX_LOGGING_TARGET = '0'
}
rm $fp_temp
systemctl daemon-reload
}
proc 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 sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
/DietPi/dietpi/func/dietpi-set_dphys-swapfile $[grep -m1 '^AUTO_SETUP_SWAPFILE_SIZE=' /DietPi/dietpi.txt | sed 's/.*=//]
}
#------------------------------------------------------------
#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..."
var 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
var 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 sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
#Apply Timezone
if test $AUTOINSTALL_TIMEZONE != "Europe/London" {
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
}
#Apply Language (Locale)
if test $AUTOINSTALL_LANGUAGE != "en_GB.UTF-8" {
G_DIETPI-NOTIFY 2 "Setting Locale $AUTOINSTALL_LANGUAGE. Please wait"
# Sanity, No result, revert back to default
if test -z $AUTOINSTALL_LANGUAGE {
setglobal AUTOINSTALL_LANGUAGE = ''en_GB.UTF-8''
}
# - Re-apply locale + auto install en_GB.UTF-8 alongside
/DietPi/dietpi/func/dietpi-set_software locale $AUTOINSTALL_LANGUAGE
}
#Apply Keyboard
if test $AUTOINSTALL_KEYBOARD != "gb" {
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
}
#Apply & Mount Network drives if installed
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[1]} == 2 ' {
/DietPi/dietpi/func/dietpi-set_smbclient 1
}
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[2]} == 2 ' {
/DietPi/dietpi/func/dietpi-set_curlftpfs 1
}
#Custom 1st run Script (Local file)
var run_custom_script = '0'
if test -f /boot/Automation_Custom_Script.sh {
setglobal INSTALL_DESCRIPTION = ''Automation - Local Custom Script''
Banner_Installing
cp /boot/Automation_Custom_Script.sh /root/AUTO_CustomScript.sh
set run_custom_script = '1'
#Custom 1st run Script (Online file)
} elif test $AUTOINSTALL_CUSTOMSCRIPTURL != "0" {
setglobal INSTALL_DESCRIPTION = ''Automation - Online Custom Script''
Banner_Installing
setglobal INSTALL_URL_ADDRESS = $AUTOINSTALL_CUSTOMSCRIPTURL
G_CHECK_URL $INSTALL_URL_ADDRESS
#Install
if sh-expr ' $? == 0 ' {
#Get script and execute
wget $INSTALL_URL_ADDRESS -O /root/AUTO_CustomScript.sh
set run_custom_script = '1'
} else {
echo -e "Automated Custom Script URL Error:\n $AUTOINSTALL_CUSTOMSCRIPTURL is offline and/or unreachable" >> $FP_DIETPIAUTOMATION_LOG
}
}
if sh-expr ' $run_custom_script ' {
chmod +x /root/AUTO_CustomScript.sh
/root/AUTO_CustomScript.sh
var result = $Status
if sh-expr ' $result == 0 ' {
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
}
}
#Apply AutoStart
/DietPi/dietpi/dietpi-autostart $AUTOINSTALL_AUTOSTARTTARGET
}
#Set Install Stage to Finished
echo 1 > /DietPi/dietpi/.install_stage
}
#/////////////////////////////////////////////////////////////////////////////////////
# First Run / Automation functions Vars (eg: on a fresh install)
#/////////////////////////////////////////////////////////////////////////////////////
setglobal AUTOINSTALL_ENABLED = '0'
setglobal AUTOINSTALL_SSHINDEX = '0'
setglobal AUTOINSTALL_FILESERVERINDEX = '0'
setglobal AUTOINSTALL_LOGGINGINDEX = '0'
setglobal AUTOINSTALL_WEBSERVERINDEX = '0'
setglobal AUTOINSTALL_AUTOSTARTTARGET = '0'
setglobal AUTOINSTALL_TIMEZONE = '0'
setglobal AUTOINSTALL_LANGUAGE = '0'
setglobal AUTOINSTALL_KEYBOARD = '0'
setglobal AUTOINSTALL_CUSTOMSCRIPTURL = '0'
proc FirstRun_Automation_Init{
#Get settings
setglobal AUTOINSTALL_ENABLED = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_AUTOMATED=' | sed 's/.*=//]
setglobal AUTOINSTALL_AUTOSTARTTARGET = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_AUTOSTART_TARGET_INDEX=' | sed 's/.*=//]
setglobal AUTOINSTALL_SSHINDEX = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_SSH_SERVER_INDEX=' | sed 's/.*=//]
setglobal AUTOINSTALL_FILESERVERINDEX = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_FILE_SERVER_INDEX=' | sed 's/.*=//]
setglobal AUTOINSTALL_LOGGINGINDEX = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_LOGGING_INDEX=' | sed 's/.*=//]
setglobal AUTOINSTALL_WEBSERVERINDEX = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_WEB_SERVER_INDEX=' | sed 's/.*=//]
setglobal AUTOINSTALL_TIMEZONE = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_TIMEZONE=' | sed 's/.*=//]
setglobal AUTOINSTALL_LANGUAGE = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_LOCALE=' | sed 's/.*=//]
setglobal AUTOINSTALL_KEYBOARD = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_KEYBOARD_LAYOUT=' | sed 's/.*=//]
setglobal AUTOINSTALL_CUSTOMSCRIPTURL = $[cat /DietPi/dietpi.txt | grep -m1 '^AUTO_SETUP_CUSTOM_SCRIPT_EXEC=' | sed 's/AUTO_SETUP_CUSTOM_SCRIPT_EXEC=//]
}
proc FirstRun_Automation_Set{
#Automated install
if sh-expr ' $AUTOINSTALL_ENABLED >= 1 ' {
G_DIETPI-NOTIFY 3 DietPi-Software "Running automated installation"
#Skip dietpi-software menu
setglobal TARGETMENUID = '-1'
#Set start install
setglobal 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
{
var index = $[ echo -e $line | grep '^AUTO_SETUP_INSTALL_SOFTWARE_ID=' | sed 's/[^0-9]*//g]
# - Flag for installation
if [[ $index =~ ^-?[0-9]+$ ]] {
aSOFTWARE_INSTALL_STATE[$index]=1
G_DIETPI-NOTIFY 2 "Automation: $(aSOFTWARE_WHIP_NAME[$index]). Flagged for installation."
}
} < /DietPi/dietpi.txt
}
#Further Automated options. (Applied regardless of AUTOINSTALL_ENABLED)
setglobal INDEX_SSHSERVER_TARGET = $AUTOINSTALL_SSHINDEX
setglobal INDEX_FILESERVER_TARGET = $AUTOINSTALL_FILESERVERINDEX
setglobal INDEX_LOGGING_TARGET = $AUTOINSTALL_LOGGINGINDEX
setglobal 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/.*=//]
}
proc 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 sh-expr ' $(cat /DietPi/dietpi/.update_stage) == 0 ' {
#Update .update_stage file to completed
echo 1 > /DietPi/dietpi/.update_stage
#Prompt user for reboot
if sh-expr ' $G_USER_INPUTS ' {
setglobal 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
}
#Reboot required NOW
reboot
Exit_Destroy
}
}
#/////////////////////////////////////////////////////////////////////////////////////
# Internet Connection Test Vars
#/////////////////////////////////////////////////////////////////////////////////////
#Use /etc/apt/sources.list for connection test
setglobal INTERNET_URL_TEST = $[grep -m1 'deb ' /etc/apt/sources.list | awk '{print $2}]
proc Check_Internet_Connection{
G_CHECK_URL $INTERNET_URL_TEST #will exit on failure here
}
#/////////////////////////////////////////////////////////////////////////////////////
# Globals
#/////////////////////////////////////////////////////////////////////////////////////
proc Input_Modes{
# - Skip menu
setglobal TARGETMENUID = '-1'
setglobal DISABLE_REBOOT = '1'
var ainput = '('"$@")
#Install software and exit.
if test $1 = "install" || test $1 = "reinstall" || test $1 = "uninstall" {
G_DIETPI-NOTIFY 3 DietPi-Software "Automated $1"
sleep 1
# - Make sure we have at least one entry
if test -z $2 {
G_DIETPI-NOTIFY 1 "Please enter a software index ID, or, choice system INDEX_*_TARGET=-?"
} else {
# - Uninstall | Stop services prior
if test $1 = "uninstall" {
# - stop services
/DietPi/dietpi/dietpi-services stop
}
# - Process inputs
for i in [$(ainput[@])]
{
#Valid int means input is unique ID for software index to be installed
if [[ $i =~ ^-?[0-9]+$ ]] {
if test $1 = "uninstall" {
Uninstall_Software $i
} elif test $1 = "reinstall" {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$i]} == 2 ' {
# - 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
setglobal 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])"
}
} elif test $1 = "install" {
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[$i]} != 2 ' {
aSOFTWARE_INSTALL_STATE[$i]=1
setglobal 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])"
}
}
}
}
# - Uninstall | Finish up and clear non-required packages
if test $1 = "uninstall" {
Uninstall_Software_Finalize
#Save
Write_InstallFileList
# - Start services
/DietPi/dietpi/dietpi-services start
}
}
#Apply permissions
} elif test $1 = "setpermissions" {
Install_Apply_Permissions &> /dev/null
G_DIETPI-NOTIFY 0 "Set permissions completed"
#List unique software names and ID's
} elif test $1 = "list" {
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 test $1 = "weblist_export" {
var fp_export_dir = ''/tmp/dietpi-software/weblist_export''
rm -R $fp_export_dir
mkdir -p $fp_export_dir
# - Category desc | Remove '─' before saving.
var fp_target = ""$fp_export_dir/category_dietpi_total""
echo -e $MAX_SOFTWARE_CATEGORIES_DIETPI > $fp_target
var fp_target = ""$fp_export_dir/category_linux_total""
echo -e $MAX_SOFTWARE_CATEGORIES_LINUX > $fp_target
set 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
set 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
var fp_target = ""$fp_export_dir/total_software_index""
echo -e $TOTAL_SOFTWARE_INDEXS > $fp_target
set fp_target = ""$fp_export_dir/software_installed_state""
printf "%i\n" $(aSOFTWARE_INSTALL_STATE[@]) > $fp_target
set fp_target = ""$fp_export_dir/software_name""
printf "%s\n" $(aSOFTWARE_WHIP_NAME[@]) > $fp_target
set fp_target = ""$fp_export_dir/software_desc""
printf "%s\n" $(aSOFTWARE_WHIP_DESC[@]) > $fp_target
set fp_target = ""$fp_export_dir/category_index""
printf "%i\n" $(aSOFTWARE_CATEGORY_INDEX[@]) > $fp_target
set fp_target = ""$fp_export_dir/software_urldocs""
printf "%s\n" $(aSOFTWARE_ONLINEDOC_URL[@]) > $fp_target
# - Available for device?
set 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
set 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"
}
unset ainput
}
proc Exit_Destroy{
Software_Arrays_Destroy
exit
}
#/////////////////////////////////////////////////////////////////////////////////////
# Error Functions
#/////////////////////////////////////////////////////////////////////////////////////
setglobal ERROR_TEXT = ''""
proc Error_Display{
#Automation | Save to logfile
if sh-expr ' $G_USER_INPUTS ' {
whiptail --title "Error" --msgbox $ERROR_TEXT 18 70
} else {
echo -e "Error: $ERROR_TEXT" >> $FP_DIETPIAUTOMATION_LOG
}
}
#/////////////////////////////////////////////////////////////////////////////////////
# Whip menus
#/////////////////////////////////////////////////////////////////////////////////////
setglobal WHIP_BACKTITLE = ''DietPi-Software''
setglobal WHIP_TITLE = '0'
setglobal WHIP_QUESTION = '0'
setglobal MENU_MAIN_LASTITEM = ''Help!''
setglobal TARGETMENUID = '0'
proc Menu_CreateSoftwareList{
#software type for this menu
var software_type = $1 #0=dietpi 1=linux
var max_categories = $MAX_SOFTWARE_CATEGORIES_DIETPI
if sh-expr ' $1 == 1 ' {
set max_categories = $MAX_SOFTWARE_CATEGORIES_LINUX
}
#-----------------------------------------------------------------------------
#Generate Whiptail menu list based on category
var 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
#-----------------------------------------------------------------------------
setglobal 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 sh-expr ' $1 == 0 ' {
setglobal INSTALL_DIETPI_CHOICESMADE = '0'
# - linux
} elif sh-expr ' $1 == 1 ' {
setglobal INSTALL_LINUX_CHOICESMADE = '0'
}
#Check for matching results (selected items)
while read choice
{
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
} < /tmp/dietpi-software_results
rm /tmp/dietpi-software_results &> /dev/null
}
proc Menu_Main{
#Data for storing SSH server index info
var index_sshserver_text = '"None'"
if sh-expr ' $INDEX_SSHSERVER_TARGET == -1 ' {
set index_sshserver_text = '"Dropbear'"
} elif sh-expr ' $INDEX_SSHSERVER_TARGET == -2 ' {
set index_sshserver_text = '"OpenSSH'"
}
#Data for storing Fileserver index info
var index_fileserver_text = '"None'"
if sh-expr ' $INDEX_FILESERVER_TARGET == -1 ' {
set index_fileserver_text = '"ProFTP'"
} elif sh-expr ' $INDEX_FILESERVER_TARGET == -2 ' {
set index_fileserver_text = '"Samba'"
}
#Data for storing Logging index info
var index_logging_text = '"None'"
if sh-expr ' $INDEX_LOGGING_TARGET == -1 ' {
set index_logging_text = '"DietPi-Ramlog #1'"
} elif sh-expr ' $INDEX_LOGGING_TARGET == -2 ' {
set index_logging_text = '"DietPi-Ramlog #2'"
} elif sh-expr ' $INDEX_LOGGING_TARGET == -3 ' {
set index_logging_text = '"Full'"
}
#Hold our string that tells the user what software will be removed when using Index based choice systems
var toberemoved_text = ''''
#Check status of USB drive
Check_USB_Drive_Installed
#Where is userdata stored?
var user_data_location_current = $[readlink -f $G_FP_DIETPI_USERDATA]
var user_data_location_description = ''''
if test $user_data_location_current = $FP_DIETPI_DEDICATED_USBDRIVE {
set user_data_location_description = ""USB Drive | $user_data_location_current""
} elif test $user_data_location_current = $G_FP_DIETPI_USERDATA {
set user_data_location_description = ""SD/EMMC | $user_data_location_current""
} else {
set user_data_location_description = ""Custom | $user_data_location_current""
}
# - Webserver preference system
var index_webserver_text = ''Apache2''
if sh-expr ' $INDEX_WEBSERVER_TARGET == -1 ' {
set index_webserver_text = ''Nginx''
} elif sh-expr ' $INDEX_WEBSERVER_TARGET == -2 ' {
set index_webserver_text = ''Lighttpd''
}
setglobal WHIP_TITLE = ''DietPi-Software''
setglobal WHIP_BACKTITLE = ""DietPi-Software | IP: $[sed -n 4p /DietPi/dietpi/.network] | Device: $G_HW_MODEL_DESCRIPTION""
setglobal 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]
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
setglobal MENU_MAIN_LASTITEM = $OPTION
match $OPTION {
with "Uninstall"
setglobal TARGETMENUID = '3'
with "Software Optimized"
setglobal TARGETMENUID = '1'
with "Software Additional"*
setglobal TARGETMENUID = '2'
with "SSH Server"
setglobal WHIP_TITLE = ''SSH Server Choices''
setglobal 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 test $OPTION = "None" {
setglobal INDEX_SSHSERVER_TARGET = '0'
set toberemoved_text = '"Dropbear and OpenSSH Server'"
} elif test $OPTION = "Dropbear" {
setglobal INDEX_SSHSERVER_TARGET = '-1'
set toberemoved_text = '"OpenSSH Server'"
} elif test $OPTION = "OpenSSH" {
setglobal INDEX_SSHSERVER_TARGET = '-2'
set toberemoved_text = '"Dropbear'"
#Reset to current
} else {
setglobal INDEX_SSHSERVER_TARGET = $INDEX_SSHSERVER_CURRENT
}
#Check for changes
setglobal INSTALL_SSHSERVER_CHOICESMADE = '0'
if sh-expr ' $INDEX_SSHSERVER_TARGET != $INDEX_SSHSERVER_CURRENT ' {
setglobal INSTALL_SSHSERVER_CHOICESMADE = '1'
#Inform user
setglobal WHIP_TITLE = '"SSH Server Change'"
setglobal 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
}
with "File Server"
setglobal WHIP_TITLE = ''Fileserver Choices''
setglobal 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 test $OPTION = "None" {
setglobal INDEX_FILESERVER_TARGET = '0'
set toberemoved_text = '"ProFTP and Samba Server'"
} elif test $OPTION = "ProFTP" {
setglobal INDEX_FILESERVER_TARGET = '-1'
set toberemoved_text = '"Samba Server'"
} elif test $OPTION = "Samba" {
setglobal INDEX_FILESERVER_TARGET = '-2'
set toberemoved_text = '"ProFTP'"
#Reset to current
} else {
setglobal INDEX_FILESERVER_TARGET = $INDEX_FILESERVER_CURRENT
}
#Check for changes
setglobal INSTALL_FILESERVER_CHOICESMADE = '0'
if sh-expr ' $INDEX_FILESERVER_TARGET != $INDEX_FILESERVER_CURRENT ' {
setglobal INSTALL_FILESERVER_CHOICESMADE = '1'
#Inform user
setglobal WHIP_TITLE = '"Fileserver Choice Change'"
setglobal 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
}
with "Log System"
setglobal WHIP_TITLE = ''Logging System Choices''
setglobal 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 test $OPTION = "None" {
setglobal INDEX_LOGGING_TARGET = '0'
set toberemoved_text = '"DietPi-Ramlog, Logrotate, Rsyslog'"
} elif test $OPTION = "DietPi-Ramlog #1" {
setglobal INDEX_LOGGING_TARGET = '-1'
set toberemoved_text = '"Logrotate, Rsyslog'"
} elif test $OPTION = "DietPi-Ramlog #2" {
setglobal INDEX_LOGGING_TARGET = '-2'
set toberemoved_text = '"Logrotate, Rsyslog'"
} elif test $OPTION = "Full" {
setglobal INDEX_LOGGING_TARGET = '-3'
set toberemoved_text = '"DietPi-Ramlog'"
#Reset to current
} else {
setglobal INDEX_LOGGING_TARGET = $INDEX_LOGGING_CURRENT
}
#Check for changes
setglobal INSTALL_LOGGING_CHOICESMADE = '0'
if sh-expr ' $INDEX_LOGGING_TARGET != $INDEX_LOGGING_CURRENT ' {
setglobal INSTALL_LOGGING_CHOICESMADE = '1'
#Inform user
setglobal WHIP_TITLE = '"Logging System Change'"
setglobal 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
}
with "User Data Location"
setglobal WHIP_TITLE = ''User Data Location''
# - Vars if we need to move data.
var move_data_target = $user_data_location_current
setglobal 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]
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
# - DriveMan
if test $OPTION = "Drive Manager" {
/DietPi/dietpi/dietpi-drive_manager
# - List
} elif test $OPTION = "List" {
/DietPi/dietpi/dietpi-drive_manager 1
var return_value = $[cat /tmp/dietpi-drive_manager_selmnt]
if test -n $return_value {
if test $return_value = "/" {
set return_value = ''/mnt''
}
set move_data_target = $return_value
set move_data_target = ''/dietpi_userdata''
}
# - Manual filepath entry
} elif test $OPTION = "Custom" {
setglobal 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]
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
set move_data_target = $OPTION
}
}
# - Move data if the new entry has changed
if test $user_data_location_current != $move_data_target {
# - 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
# - Move data, setup symlinks
/DietPi/dietpi/func/dietpi-set_userdata $user_data_location_current $move_data_target
if sh-expr ' $? == 0 ' {
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
}
}
}
}
with "Webserver Preference"
setglobal WHIP_TITLE = ''Webserver Preference''
setglobal 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 test $OPTION = "Apache2" {
setglobal INDEX_WEBSERVER_TARGET = '0'
} elif test $OPTION = "Nginx" {
setglobal INDEX_WEBSERVER_TARGET = '-1'
} elif test $OPTION = "Lighttpd" {
setglobal INDEX_WEBSERVER_TARGET = '-2'
#Reset to current
} else {
setglobal INDEX_WEBSERVER_TARGET = $INDEX_WEBSERVER_CURRENT
}
#Check for changes
if sh-expr ' $INDEX_WEBSERVER_TARGET != $INDEX_WEBSERVER_CURRENT ' {
# - Check for existing and compatible installed stacks before allowing the change
var incompatible_webserver_preference = '0'
var info_currently_installed_webserver = ''None''
if sh-expr ' $(dpkg -l | awk '{print $2}' | grep -ci -m1 'apache2')' {
setglobal INDEX_WEBSERVER_CURRENT = '0'
set info_currently_installed_webserver = ''Apache2''
if sh-expr ' $INDEX_WEBSERVER_TARGET != 0 ' {
set incompatible_webserver_preference = '1'
}
} elif sh-expr ' $(dpkg -l | awk '{print $2}' | grep -ci -m1 'nginx') ' {
setglobal INDEX_WEBSERVER_CURRENT = '-1'
set info_currently_installed_webserver = ''Nginx''
if sh-expr ' $INDEX_WEBSERVER_TARGET != -1 ' {
set incompatible_webserver_preference = '1'
}
} elif sh-expr ' $(dpkg -l | awk '{print $2}' | grep -ci -m1 'lighttpd') ' {
setglobal INDEX_WEBSERVER_CURRENT = '-2'
set info_currently_installed_webserver = ''Lighttpd''
if sh-expr ' $INDEX_WEBSERVER_TARGET != -2 ' {
set incompatible_webserver_preference = '1'
}
}
# - Reset preference selection
if sh-expr ' $incompatible_webserver_preference == 1 ' {
setglobal INDEX_WEBSERVER_TARGET = $INDEX_WEBSERVER_CURRENT
# - inform user
setglobal WHIP_TITLE = '"Error: Incompatible Webserver Preference'"
setglobal 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
setglobal WHIP_TITLE = '"Webserver Preference Changed'"
setglobal 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().
}
}
with "DietPi-Config"
/DietPi/dietpi/dietpi-config
with "Help!"
#Populate help to text file so we can read it back to whiptail, as a scrollbox.
cat << """ > /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:
───────────────────────────────────────────────────────────────
"""
> /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 $shExpr(' $(tput lines) - 3 ') $shExpr(' $(tput cols) - 3 ') --scrolltext
with Install
Menu_StartInstall
}
#Exit/Abort Setup
} else {
Menu_Exit
}
}
proc Menu_Exit{
#1st run install
if sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
setglobal WHIP_TITLE = ''Exit Setup?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
Banner_Aborted
#Exit script NOW
Exit_Destroy
} else {
#Return to Main Menu
setglobal TARGETMENUID = '0'
}
#Standard exit
} elif sh-expr ' $G_DIETPI_INSTALL_STAGE == 1 ' {
setglobal WHIP_TITLE = ''Exit DietPi-Software?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
Banner_Aborted
#Exit script NOW
Exit_Destroy
} else {
#Return to Main Menu
setglobal TARGETMENUID = '0'
}
}
}
proc Menu_ConfirmInstall{
#Obtain list of pending software installation:
var 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
setglobal WHIP_TITLE = ''DietPi - Start Installation?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
#exit menu system
setglobal TARGETMENUID = '-1'
#Enable installation start flag
setglobal GOSTARTINSTALL = '1'
} else {
#Return to Main Menu
setglobal TARGETMENUID = '0'
}
}
proc Menu_StartInstall{
#Check if the user has made changes to their software selections.
if sh-expr ' $INSTALL_DIETPI_CHOICESMADE ||
$INSTALL_LINUX_CHOICESMADE ||
$INSTALL_SSHSERVER_CHOICESMADE ||
$INSTALL_FILESERVER_CHOICESMADE ||
$INSTALL_LOGGING_CHOICESMADE ' {
# Confirm install with user
Menu_ConfirmInstall
} else {
#1st run install
if sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
setglobal WHIP_TITLE = ''No Software Selected. Continue?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
#exit menu system
setglobal TARGETMENUID = '-1'
#Enable installation start flag
setglobal GOSTARTINSTALL = '1'
} else {
#Return to Main Menu
setglobal TARGETMENUID = '0'
}
#Not 1st run
} elif sh-expr ' $G_DIETPI_INSTALL_STAGE == 1 ' {
setglobal WHIP_TITLE = ''No Changes to Software Selection''
whiptail --title $WHIP_TITLE --msgbox "No changes have been detected. Unable to start installation." 8 65
}
}
}
#TARGETMENUID=1
proc Menu_Dietpi_Software{
#-----------------------------------------------------------------------------
#Generate Whiptail menu and store results into our software arrays
Menu_CreateSoftwareList 0
#Return to Main Menu
setglobal TARGETMENUID = '0'
#-----------------------------------------------------------------------------
#Install Info/Warnings
#OMV, .deb package has Nginx as a dependancy. Not compatible with other webservers
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[126]} == 1 &&
( ${aSOFTWARE_INSTALL_STATE[77]} == 0 && ${aSOFTWARE_INSTALL_STATE[78]} == 0 && ${aSOFTWARE_INSTALL_STATE[79]} == 0 && $INDEX_WEBSERVER_TARGET != -1 ) ' {
setglobal WHIP_TITLE = ''OMV: Requires Nginx''
setglobal 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
}
#SickRage, setup for Transmission, install it aswell?
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[116]} == 1 &&
${aSOFTWARE_INSTALL_STATE[44]} == 0 ' {
setglobal WHIP_TITLE = ''SickRage - Install Transmission?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
aSOFTWARE_INSTALL_STATE[44]=1
}
}
#Gogs: Requires OpenSSH for ssh-keygen binary: https://github.com/Fourdee/DietPi/issues/442
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[49]} == 1 && $INDEX_SSHSERVER_TARGET != -2 ' {
setglobal WHIP_TITLE = ''Gogs: Requires OpenSSH''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
# - Use SSH target index to ensure Dropbear gets removed if installed.
setglobal INDEX_SSHSERVER_TARGET = '-2'
} else {
aSOFTWARE_INSTALL_STATE[49]=0
}
}
#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 sh-expr ' ${aSOFTWARE_INSTALL_STATE[90]} == 1 &&
$INDEX_WEBSERVER_TARGET == -2 &&
( ${aSOFTWARE_INSTALL_STATE[80]} < 2 && ${aSOFTWARE_INSTALL_STATE[82]} < 2 ) ' {
setglobal WHIP_TITLE = ''PhpMyAdmin''
setglobal 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
}
#DietPiCam - warn user of locking out camera: https://github.com/Fourdee/DietPi/issues/249
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[59]} == 1 ' {
setglobal WHIP_TITLE = ''DietPi Cam - Camera''
setglobal 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
}
#EmonHUB/EmonPi
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[99]} == 1 ' {
# - Enter API KEY
# - Grab key from dietpi.txt
setglobal USER_EMONHUB_APIKEY_CURRENT = $[cat /DietPi/dietpi.txt | grep -m1 '^SOFTWARE_EMONHUB_APIKEY=' | sed 's/.*=//]
while sh-expr ' $USER_EMONHUB_APIKEY_COMPLETED == 0 ' {
setglobal WHIP_TITLE = ''EmonPi/Hub - API KEY''
setglobal 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.'"
setglobal OPTION = $[whiptail --inputbox $WHIP_QUESTION 14 75 $USER_EMONHUB_APIKEY_CURRENT --title $WHIP_TITLE --backtitle $WHIP_BACKTITLE !3 > !1 !1 > !2 !2 > !3]
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
setglobal USER_EMONHUB_APIKEY_CURRENT = $OPTION
setglobal WHIP_TITLE = ''EmonPi/Hub - API KEY''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
# - 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
setglobal USER_EMONHUB_APIKEY_COMPLETED = '1'
}
}
}
}
#Pi-hole.
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[93]} == 1 ' {
# - prompt for static ip.
setglobal WHIP_TITLE = '' Pi-hole - Setup Static IP Now?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
setglobal WHIP_TITLE = '' Pi-hole - Setup Static IP''
setglobal 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
}
}
#Wifi Hotspot Criteria
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[60]} == 1 ' ||
sh-expr ' ${aSOFTWARE_INSTALL_STATE[61]} == 1 ' {
#Enable wifi modules
/DietPi/dietpi/func/dietpi-set_hardware wifimodules enable
var check_criteria = '1'
while sh-expr ' $check_criteria == 1 ' {
var criteria_passed = '1'
setglobal WHIP_TITLE = '"WiFi Hotspot Criteria'"
setglobal WHIP_QUESTION = '"The following criteria must be met for this installation to succeed:'"
var ethernet_active_state = $[ip r | grep -ci -m1 "eth$[sed -n 1p /DietPi/dietpi/.network]]
if sh-expr ' $ethernet_active_state == 1 ' {
setglobal WHIP_QUESTION = '"\n\n - Ethernet online: PASSED'"
} else {
set criteria_passed = '0'
setglobal WHIP_QUESTION = '"\n\n - Ethernet online: FAILED.\nUse dietpi-config to connect and configure ethernet.'"
}
if test -d /sys/class/net/wlan$[sed -n 2p /DietPi/dietpi/.network] {
setglobal WHIP_QUESTION = '"\n\n - Wifi adapter detected: PASSED'"
} else {
set criteria_passed = '0'
setglobal WHIP_QUESTION = '"\n\n - Wifi adapter detected: FAILED.\nPlease connect a WiFi adapter and try again.'"
}
#Passed
if sh-expr ' $criteria_passed == 1 ' {
setglobal WHIP_QUESTION = '"\n\nPASSED: Criteria met. Good to go.'"
whiptail --title $WHIP_TITLE --msgbox $WHIP_QUESTION --backtitle $WHIP_BACKTITLE 14 75
set check_criteria = '0'
#Failed, retry?
} else {
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
echo "retry" &> /dev/null
} else {
# - Disable user selection
set 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
}
}
}
}
#Weaved
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[68]} == 1 ' {
setglobal WHIP_TITLE = ''Remot3.it - 1st run setup''
setglobal 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
}
#LetsEncrypt
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[92]} == 1 ' {
setglobal WHIP_TITLE = ''Lets Encrypt Info''
setglobal 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
}
#-----------------------------------------------------------------------------
#dietpi-config can be used to install/configure the following software. Ask user.
#NoIp
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[67]} == 1 ' {
setglobal WHIP_TITLE = ''NoIp - Setup Now?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
#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
}
}
#-----------------------------------------------------------------------------
#Boot Choices
if sh-expr ' ${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 ' {
# Set Boot Order
setglobal WHIP_TITLE = '' DietPi - Boot Options''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
/DietPi/dietpi/dietpi-autostart
}
}
}
#TARGETMENUID=2
proc Menu_Linux_Software{
#Inform User that DietPi software will automatically install additional linux software when required.
if sh-expr ' ! $USER_LINUX_AUTOINSTALL_PROMPT_DISPLAYED ' {
setglobal WHIP_TITLE = ''Additional Linux Software''
setglobal 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
setglobal USER_LINUX_AUTOINSTALL_PROMPT_DISPLAYED = '1'
}
#-----------------------------------------------------------------------------
#Generate Whiptail menu and store results into our software arrays
Menu_CreateSoftwareList 1
#Return to Main Menu
setglobal TARGETMENUID = '0'
#-----------------------------------------------------------------------------
#dietpi-config can be used to install/configure the following software. Ask user.
#CurlFTPfs -
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[2]} == 1 ' {
setglobal WHIP_TITLE = ''FTP Client - Setup Now?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
#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
}
}
#SMBCLIENT -
if sh-expr ' ${aSOFTWARE_INSTALL_STATE[1]} == 1 ' {
setglobal WHIP_TITLE = ''Samba Client - Setup Now?''
setglobal 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
setglobal CHOICE = $Status
if sh-expr ' $CHOICE == 0 ' {
#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
}
}
#-----------------------------------------------------------------------------
}
#TARGETMENUID=3
proc Menu_Uninstall_Software{
#Return to main menu
setglobal TARGETMENUID = '0'
#Array which will hold all software indexs to be removed.
var asoftware_for_uninstall = ''()
var 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 sh-expr ' $software_installed_count == 0 ' {
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
{
match $choice {
with *
#Convert lined list into a 1 line string.
set asoftware_for_uninstall = '('"$choice")
}
} < /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 sh-expr ' ${#asoftware_for_uninstall[@]} > 0 ' {
# - Create list
setglobal 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
setglobal CHOICE = $Status
#Run uninstall
if sh-expr ' $CHOICE == 0 ' {
# - 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
}
}
}
#delete[] arrays
unset whiptail_list_array
unset asoftware_for_uninstall
}
#/////////////////////////////////////////////////////////////////////////////////////
# Banner Print
#/////////////////////////////////////////////////////////////////////////////////////
proc Banner_Setup{
/DietPi/dietpi/dietpi-banner 0
echo -e "\n Welcome to DietPi-Software \n"
}
proc Banner_Installing{
G_DIETPI-NOTIFY 3 DietPi-Software "Installing $(aSOFTWARE_WHIP_NAME[$INSTALLING_INDEX]): $(aSOFTWARE_WHIP_DESC[$INSTALLING_INDEX])"
}
proc Banner_Configuration{
G_DIETPI-NOTIFY 3 DietPi-Software "Configuring $(aSOFTWARE_WHIP_NAME[$INSTALLING_INDEX]): $(aSOFTWARE_WHIP_DESC[$INSTALLING_INDEX])"
}
proc Banner_Apt_Update{
G_DIETPI-NOTIFY 3 DietPi-Software "Update & upgrade APT"
sleep 1
}
proc Banner_Reboot{
if sh-expr ' ! $DISABLE_REBOOT ' {
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."
}
}
proc 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"
}
proc Banner_Aborted{
#1st run abort
if sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
/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
}
}
#/////////////////////////////////////////////////////////////////////////////////////
# 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 test -n $1 {
# - Run input mode
Input_Modes @Argv
#--------------------------------------------------------------------------------------
#Standard launch
} else {
#Check if we are setting no user inputs and prompts
# - Load all automation vars
if sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
FirstRun_Automation_Init
}
#GPL compliance prompt
if sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 && $G_USER_INPUTS ' {
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
}
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 sh-expr ' $(cat /DietPi/dietpi/.update_stage) == -1 ' {
Check_Internet_Connection
FirstRun_DietPi_Update
}
#Apply 1st run automation
if sh-expr ' $G_DIETPI_INSTALL_STAGE == 0 ' {
#Activate automation settings from dietpi.txt, if set.
FirstRun_Automation_Set
}
#Start DietPi Menu
while sh-expr ' $TARGETMENUID > -1 ' {
clear
if sh-expr ' $TARGETMENUID == 0 ' {
Menu_Main
} elif sh-expr ' $TARGETMENUID == 1 ' {
Menu_Dietpi_Software
} elif sh-expr ' $TARGETMENUID == 2 ' {
Menu_Linux_Software
} elif sh-expr ' $TARGETMENUID == 3 ' {
Menu_Uninstall_Software
}
}
}
#--------------------------------------------------------------------------------------
#Start DietPi-Software installs
if sh-expr ' $GOSTARTINSTALL ' {
#Insufficient free space
/DietPi/dietpi/dietpi-drive_manager 2
if sh-expr ' $? != 0 ' {
Exit_Destroy
}
Check_Internet_Connection
#Start installations for software
Run_Installations
#Upload DietPi-Survey Data
/DietPi/dietpi/dietpi-survey &> /dev/null
#Reboot
Banner_Reboot
if sh-expr ' $DISABLE_REBOOT ' {
# - Start services
/DietPi/dietpi/dietpi-services start
} else {
sync
reboot
}
}
#-----------------------------------------------------------------------------------
Exit_Destroy
#-----------------------------------------------------------------------------------
}