diff:
@@ -77,6 +77,17 @@ usage() {
grep '^#/' "${SCRIPTPATH}/${SCRIPTNAME}" | cut -c4-
}
+# # Menu Runner Function
+run_menu() {
+ local MENUSNAME="${1:-}"; shift
+ if [[ -f ${SCRIPTPATH}/scripts/menus/${MENUSNAME}.sh ]]; then
+ source "${SCRIPTPATH}/scripts/menus/${MENUSNAME}.sh"
+ ${MENUSNAME} "$@";
+ else
+ fatal "${SCRIPTPATH}/scripts/menus/${MENUSNAME}.sh not found."
+ fi
+}
+
# # Script Runner Function
run_script() {
local SCRIPTSNAME="${1:-}"; shift
@@ -104,5 +115,6 @@ main() {
run_script 'root_check'
source "${SCRIPTPATH}/scripts/cmdline.sh"
cmdline "${ARGS[@]:-}"
+ run_menu 'menu_main'
}
main

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+menu_app_helper() {
+ GetMenuItem() {
+ local APPNAME
+ APPNAME="${1}"
+ local APPENABLED
+ APPENABLED=$(run_script 'env_get' "${APPNAME}_ENABLED")
+ local APPONOFF
+ if [[ ${APPENABLED} == "true" ]]; then
+ APPONOFF="on"
+ else
+ APPONOFF="off"
+ fi
+ case "${APPNAME}" in
+ "BAZARR")
+ SupportedAppDescr+=("Bazarr" "Companion to Sonarr to manage and download subtitles" "${APPONOFF}")
+ ;;
+ "COUCHPOTATO")
+ SupportedAppDescr+=("Couchpotato" "Movies PVR Client" "${APPONOFF}")
+ ;;
+ "DELUGE")
+ SupportedAppDescr+=("Deluge" "Lightweight, Full-featured BitTorrent client" "${APPONOFF}")
+ ;;
+ "DUCKDNS")
+ SupportedAppDescr+=("DuckDNS" "free service which will point a DNS to an IP of your choice" "${APPONOFF}")
+ ;;
+ "DUPLICATI")
+ SupportedAppDescr+=("Duplicati" "Backup software to store backups online with strong encryption" "${APPONOFF}")
+ ;;
+ "EMBY")
+ SupportedAppDescr+=("Emby" "Organize, play, and stream audio and video" "${APPONOFF}")
+ ;;
+ "HEADPHONES")
+ SupportedAppDescr+=("Headphones" "Music PVR Client" "${APPONOFF}")
+ ;;
+ "HOMEASSISTANT")
+ SupportedAppDescr+=("Home Assistant" "Track and control all devices at home and automate control" "${APPONOFF}")
+ ;;
+ "HYDRA2")
+ SupportedAppDescr+=("Hydra2" "Meta search for NZB indexers" "${APPONOFF}")
+ ;;
+ "JACKETT")
+ SupportedAppDescr+=("Jackett" "API Support for your favorite private trackers" "${APPONOFF}")
+ ;;
+ "LAZYLIBRARIAN")
+ SupportedAppDescr+=("Lazylibrarian" "Book PVR Client" "${APPONOFF}")
+ ;;
+ "LETSENCRYPT")
+ SupportedAppDescr+=("Letsencrypt" "Certificate authority that provides free X.509 certificates" "${APPONOFF}")
+ ;;
+ "LIDARR")
+ SupportedAppDescr+=("Lidarr" "Music download manager for Usenet and BitTorrent users" "${APPONOFF}")
+ ;;
+ "LOGARR")
+ SupportedAppDescr+=("Logarr" "Self-hosted, single-page, log consolidation tool" "${APPONOFF}")
+ ;;
+ "MONITORR")
+ SupportedAppDescr+=("Monitorr" "Webfront to live display the status of any webapp or service" "${APPONOFF}")
+ ;;
+ "MUXIMUX")
+ SupportedAppDescr+=("Muximux" "A lightweight way to manage your HTPC" "${APPONOFF}")
+ ;;
+ "NZBGET")
+ SupportedAppDescr+=("NZBGet" "NZB Newsgrabber / Downloader" "${APPONOFF}")
+ ;;
+ "OMBI")
+ SupportedAppDescr+=("Ombi" "Allow your users to Request Movies, TV Shows and Albums" "${APPONOFF}")
+ ;;
+ "ORGANIZR")
+ SupportedAppDescr+=("Organizr" "HTPC/Homelab Services Organizer" "${APPONOFF}")
+ ;;
+ "PLEX")
+ SupportedAppDescr+=("Plex" "Organizes all of your video, music and photo collections" "${APPONOFF}")
+ ;;
+ "PLEXREQUESTS")
+ SupportedAppDescr+=("Plex Requests" "Automated way for users to request new content for Plex" "${APPONOFF}")
+ ;;
+ "PORTAINER")
+ SupportedAppDescr+=("Portainer" "Simple management UI for Docker" "${APPONOFF}")
+ ;;
+ "RADARR")
+ SupportedAppDescr+=("Radarr" "Automatically download movies via Usenet and BitTorrent" "${APPONOFF}")
+ ;;
+ "RUTORRENT")
+ SupportedAppDescr+=("ruTorrent" "Web front-end for rTorrent" "${APPONOFF}")
+ ;;
+ "SABNZBD")
+ SupportedAppDescr+=("SABnzbd" "NZB Newsgrabber / Downloader" "${APPONOFF}")
+ ;;
+ "SICKRAGE")
+ SupportedAppDescr+=("Sickrage" "Automatic Video Library Manager for TV Shows" "${APPONOFF}")
+ ;;
+ "SONARR")
+ SupportedAppDescr+=("Sonarr" "Smart TV show PVR via Usenet and BitTorrent" "${APPONOFF}")
+ ;;
+ "SYNCTHING")
+ SupportedAppDescr+=("Syncthing" "Open-source peer-to-peer file synchronization" "${APPONOFF}")
+ ;;
+ "TAUTULLI")
+ SupportedAppDescr+=("Tautulli" "Monitoring and tracking tool for Plex Media Server" "${APPONOFF}")
+ ;;
+ "TRANSMISSION")
+ SupportedAppDescr+=("Transmission" "Fast, easy, and free BitTorrent client" "${APPONOFF}")
+ ;;
+ "UNIFI")
+ SupportedAppDescr+=("Unifi" "Controller software for wireless networks" "${APPONOFF}")
+ ;;
+ "WATCHTOWER")
+ SupportedAppDescr+=("Watchtower" "Automatically update running Docker containers" "${APPONOFF}")
+ ;;
+ *)
+ warning "WARNING ${APPNAME} APP DESCRIPTION NOT FOUND"
+ SupportedAppDescr+=("${APPNAME}" "Description not found" "${APPONOFF}")
+ ;;
+ esac
+ }
+
+ SupportedAppDescr=()
+ while IFS= read -r line; do
+ local APPNAME
+ APPNAME=${line/_ENABLED=*/}
+ local FILENAME
+ FILENAME=${APPNAME,,}
+ if [[ -d ${SCRIPTPATH}/compose/.apps/${FILENAME}/ ]]; then
+ if [[ -f ${SCRIPTPATH}/compose/.apps/${FILENAME}/${FILENAME}.yml ]]; then
+ if [[ ${ARCH} == "arm64" ]]; then
+ if [[ -f ${SCRIPTPATH}/compose/.apps/${FILENAME}/${FILENAME}.arm64.yml ]]; then
+ GetMenuItem "${APPNAME}"
+ elif [[ -f ${SCRIPTPATH}/compose/.apps/${FILENAME}/${FILENAME}.armhf.yml ]]; then
+ GetMenuItem "${APPNAME}"
+ fi
+ fi
+ if [[ ${ARCH} == "armhf" ]]; then
+ if [[ -f ${SCRIPTPATH}/compose/.apps/${FILENAME}/${FILENAME}.armhf.yml ]]; then
+ GetMenuItem "${APPNAME}"
+ fi
+ fi
+ if [[ ${ARCH} == "amd64" ]]; then
+ GetMenuItem "${APPNAME}"
+ fi
+ fi
+ fi
+ done < <(grep '_ENABLED=' < "${SCRIPTPATH}/compose/.env")
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+application_selector() {
+ SupportedAppDescr=()
+ run_script 'menu_app_helper'
+
+ # Might need to be adjusted if more applications are added
+ local LINES
+ LINES=$(stty size | cut '-d ' -f1)
+ LINES=$((LINES<27?LINES:27))
+
+ local COLUMNS
+ COLUMNS=$(stty size | cut '-d ' -f2)
+ COLUMNS=$((COLUMNS<92?COLUMNS:92))
+
+ local NETLINES
+ NETLINES=$((LINES-10))
+
+ local tempfile
+ tempfile=$(mktemp)
+
+ if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]]; then
+ whiptail --title "Application Selector" --fb --checklist --separate-output "Choose which apps you would like to install:" --fb ${LINES} ${COLUMNS} ${NETLINES} "${SupportedAppDescr[@]}" 2>"${tempfile}"
+ fi
+ #TODO - Ask if the user wants the disable the other apps in .env
+
+ while read -r choice; do
+ run_script 'env_set' "$(echo "${choice^^}" | tr -d ' ')_ENABLED" 'true'
+ done < "${tempfile}"
+
+ rm -f "${tempfile}"
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+config_folder_set() {
+ if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Configs Location" --fb --yesno \
+ "The default place for config files is: ${DETECTED_HOMEDIR}/.docker/config\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 12 78); then
+
+ #TODO - Check if the folder exists?
+ #TODO - Set permissions on the folder?
+ run_script 'env_set' 'DOCKERCONFDIR' "${DETECTED_HOMEDIR}/.docker/config"
+ else
+ run_menu 'input_prompt' 'DOCKERCONFDIR' "${DETECTED_HOMEDIR}/.docker/config"
+ fi
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+download_folder_set() {
+ if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Dowloads Location" --fb --yesno \
+ "The default place for download files is: ${DETECTED_HOMEDIR}/Downloads\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 12 78); then
+
+ #TODO - Should we check if the folder exists?
+ #TODO - Should we set permissions on the folder?
+ run_script 'env_set' 'DOWNLOADSDIR' "${DETECTED_HOMEDIR}/Downloads"
+ else
+ run_menu 'input_prompt' 'DOWNLOADSDIR' "${DETECTED_HOMEDIR}/Downloads"
+ fi
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+input_prompt() {
+ local SET_VAR
+ SET_VAR=${1:-}
+ local NEW_VAL
+ NEW_VAL=${2:-}
+ local INPUT
+ if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]]; then
+ INPUT=$(whiptail --inputbox "What would you like to set ${SET_VAR} to?" 12 78 "${NEW_VAL}" --fb --title "Set folder" 3>&1 1>&2 2>&3)
+ else
+ INPUT="${2}"
+ fi
+
+ if [[ -d ${INPUT} ]]; then
+ run_script 'env_set' "${SET_VAR}" "${INPUT}"
+ else
+ whiptail --title "Error" --msgbox "${INPUT} is not a valid path. Please try again." --fb 9 78
+ input_prompt "${SET_VAR}" "${NEW_VAL}"
+ fi
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+media_folders_set() {
+ if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Media Locations" --fb --yesno \
+ "The default place for Media files is:\\n${DETECTED_HOMEDIR}/Books\\n${DETECTED_HOMEDIR}/Movies\\n${DETECTED_HOMEDIR}/Music\\n${DETECTED_HOMEDIR}/TV\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 17 78); then
+
+ #TODO - Should we check if the folder exists?
+ #TODO - Should we set permissions on the folder?
+ run_script 'env_set' 'MEDIADIR_BOOKS' "${DETECTED_HOMEDIR}/Books"
+ run_script 'env_set' 'MEDIADIR_MOVIES' "${DETECTED_HOMEDIR}/Movies"
+ run_script 'env_set' 'MEDIADIR_MUSIC' "${DETECTED_HOMEDIR}/Music"
+ run_script 'env_set' 'MEDIADIR_TV' "${DETECTED_HOMEDIR}/TV"
+ else
+ run_menu 'input_prompt' 'MEDIADIR_BOOKS' "${DETECTED_HOMEDIR}/Books"
+ run_menu 'input_prompt' 'MEDIADIR_MOVIES' "${DETECTED_HOMEDIR}/Movies"
+ run_menu 'input_prompt' 'MEDIADIR_MUSIC' "${DETECTED_HOMEDIR}/Music"
+ run_menu 'input_prompt' 'MEDIADIR_TV' "${DETECTED_HOMEDIR}/TV"
+ fi
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+menu_main() {
+ local LINES
+ LINES=$(stty size | cut '-d ' -f1)
+ LINES=$((LINES<14?LINES:14))
+
+ local COLUMNS
+ COLUMNS=$(stty size | cut '-d ' -f2)
+ COLUMNS=$((COLUMNS<70?COLUMNS:70))
+
+ local NETLINES
+ NETLINES=$((LINES<4?LINES:4))
+
+ local MAINCHOICE
+ MAINCHOICE=$(whiptail --title "DockSTARTer" \
+ --menu "What would you like to do?" \
+ --fb --cancel-button "Exit" \
+ ${LINES} ${COLUMNS} ${NETLINES} \
+ "Configure Apps" "Setup and start applications" \
+ "Install Dependencies" "Latest version of Docker and Docker-Compose" \
+ "Update DockStarter" "Get the latest version of DockSTARTer" 3>&1 1>&2 2>&3)
+
+ case "${MAINCHOICE}" in
+ "Configure Apps")
+ run_script 'ui_config'
+ ;;
+ "Install Dependencies")
+ run_script 'ui_install'
+ ;;
+ "Update DockStarter")
+ run_script 'ui_update'
+ ;;
+ *)
+ error "Invalid Option"
+ ;;
+ esac
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+timezone_set() {
+ # Get the current TimeZone and ask if its ok or they want to change it.
+ local CURRENTTIMEZONE
+ CURRENTTIMEZONE="$(cat /etc/timezone)"
+
+ if [[ ${CI:-} == true ]] && [[ ${TRAVIS:-} == true ]]; then
+ run_script 'env_set' 'TZ' "${CURRENTTIMEZONE}"
+ else
+ whiptail --title "Time Zone" --fb --yesno --yes-button "OK" --no-button "Cancel" \
+ "Your Current Time Zone is: ${CURRENTTIMEZONE} \\nThis will be passed into the applications.\\n\\nIf this is incorrect cancel now and change your system time zone!" 12 78
+
+ run_script 'env_set' 'TZ' "${CURRENTTIMEZONE}"
+ fi
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+user_group_set() {
+ if [[ ${CI:-} == true ]] && [[ ${TRAVIS:-} == true ]]; then
+ run_script 'env_set' 'PUID' "${DETECTED_PUID}"
+ run_script 'env_set' 'PGID' "${DETECTED_PGID}"
+ else
+ whiptail --title "User and Group" --fb --yesno --yes-button "OK" --no-button "Cancel" \
+ "The detected User is: ${DETECTED_UNAME}\\nThe detected Group is: ${DETECTED_UGROUP}\\n\\nThis will be passed into the applications.\\n\\nPlease cancel if this is incorrect or adjust .env file manually after." 14 78
+
+ run_script 'env_set' 'PUID' "${DETECTED_PUID}"
+ run_script 'env_set' 'PGID' "${DETECTED_PGID}"
+ fi
+}

diff:
@@ -10,7 +10,7 @@ run_apt() {
apt-get -y dist-upgrade > /dev/null 2>&1
fi
info "Installing dependencies."
- apt-get -qq install curl git grep sed apt-transport-https > /dev/null 2>&1
+ apt-get -qq install curl git grep sed apt-transport-https whiptail > /dev/null 2>&1
info "Removing unused packages."
apt-get -y autoremove > /dev/null 2>&1
info "Cleaning up unused packages."

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+ui_config() {
+ run_script 'env_create' menu
+ run_menu 'application_selector'
+ run_menu 'timezone_set'
+ run_menu 'user_group_set'
+ run_menu 'config_folder_set'
+ run_menu 'download_folder_set'
+ run_menu 'media_folders_set'
+ run_script 'generate_yml'
+ run_script 'run_compose' menu
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+ui_install() {
+ run_script 'run_apt'
+ run_script 'install_yq' force
+ run_script 'install_docker' force
+ run_script 'install_machine_completion'
+ run_script 'install_compose' force
+ run_script 'install_compose_completion'
+ run_script 'setup_docker_group'
+ run_script 'enable_docker_systemd'
+ run_script 'request_reboot' menu
+}

diff:
+#!/bin/bash
+set -euo pipefail
+IFS=$'\n\t'
+
+ui_update() {
+ run_script 'update_self' menu
+ run_script 'run_apt'
+ run_script 'install_yq' force
+ run_script 'install_docker' force
+ run_script 'install_machine_completion'
+ run_script 'install_compose' force
+ run_script 'install_compose_completion'
+}

original_message: GUI menus to control install and maintenance (#108)


message: GUI - Check .env file for set params

change_type: MODIFY

diff:
@@ -3,13 +3,18 @@ set -euo pipefail
IFS=$'\n\t'
config_folder_set() {
+
+ local ENVDOCCONFDIR
+ ENVDOCCONFDIR=$(run_script 'env_get' 'DOCKERCONFDIR')
+ ENVDOCCONFDIR="${ENVDOCCONFDIR:-"${DETECTED_HOMEDIR}/.docker/config"}"
+
if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Configs Location" --fb --yesno \
- "The default place for config files is: ${DETECTED_HOMEDIR}/.docker/config\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 12 78); then
+ "The detected .env parameter or suggested place for config files is:\\n${ENVDOCCONFDIR}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 14 78); then
reset || true
#TODO - Check if the folder exists?
#TODO - Set permissions on the folder?
- run_script 'env_set' 'DOCKERCONFDIR' "${DETECTED_HOMEDIR}/.docker/config"
+ run_script 'env_set' 'DOCKERCONFDIR' "${ENVDOCCONFDIR}"
else
- run_menu 'input_prompt' 'DOCKERCONFDIR' "${DETECTED_HOMEDIR}/.docker/config"
+ run_menu 'input_prompt' 'DOCKERCONFDIR' "${ENVDOCCONFDIR}"
fi
}

diff:
@@ -3,13 +3,18 @@ set -euo pipefail
IFS=$'\n\t'
download_folder_set() {
+
+ local ENVDOWNLOADSDIR
+ ENVDOWNLOADSDIR=$(run_script 'env_get' 'DOWNLOADSDIR')
+ ENVDOWNLOADSDIR="${ENVDOWNLOADSDIR:-"${DETECTED_HOMEDIR}/Downloads"}"
+
if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Dowloads Location" --fb --yesno \
- "The default place for download files is: ${DETECTED_HOMEDIR}/Downloads\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 12 78); then
+ "The default place for download files is:\\n${ENVDOWNLOADSDIR}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 14 78); then
reset || true
#TODO - Should we check if the folder exists?
#TODO - Should we set permissions on the folder?
- run_script 'env_set' 'DOWNLOADSDIR' "${DETECTED_HOMEDIR}/Downloads"
+ run_script 'env_set' 'DOWNLOADSDIR' "${ENVDOWNLOADSDIR}"
else
- run_menu 'input_prompt' 'DOWNLOADSDIR' "${DETECTED_HOMEDIR}/Downloads"
+ run_menu 'input_prompt' 'DOWNLOADSDIR' "${ENVDOWNLOADSDIR}"
fi
}

diff:
@@ -3,19 +3,36 @@ set -euo pipefail
IFS=$'\n\t'
media_folders_set() {
+
+ local ENVBOOKS
+ ENVBOOKS=$(run_script 'env_get' 'MEDIADIR_BOOKS')
+ ENVBOOKS="${ENVBOOKS:-"${DETECTED_HOMEDIR}/Books"}"
+
+ local ENVMOVIES
+ ENVMOVIES=$(run_script 'env_get' 'MEDIADIR_MOVIES')
+ ENVMOVIES="${ENVMOVIES:-"${DETECTED_HOMEDIR}/Movies"}"
+
+ local ENVMUSIC
+ ENVMUSIC=$(run_script 'env_get' 'MEDIADIR_MUSIC')
+ ENVMUSIC="${ENVMUSIC:-"${DETECTED_HOMEDIR}/Music"}"
+
+ local ENVTV
+ ENVTV=$(run_script 'env_get' 'MEDIADIR_TV')
+ ENVTV="${ENVTV:-"${DETECTED_HOMEDIR}/TV"}"
+
if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Media Locations" --fb --yesno \
- "The default place for Media files is:\\n${DETECTED_HOMEDIR}/Books\\n${DETECTED_HOMEDIR}/Movies\\n${DETECTED_HOMEDIR}/Music\\n${DETECTED_HOMEDIR}/TV\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 17 78); then
+ "The detected .env parameter or suggested place for Media files is:\\nBooks = ${ENVBOOKS}\\nMovies = ${ENVMOVIES}\\nMusic = ${ENVMUSIC}\\nTV = ${ENVTV}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 17 78); then
reset || true
#TODO - Should we check if the folder exists?
#TODO - Should we set permissions on the folder?
- run_script 'env_set' 'MEDIADIR_BOOKS' "${DETECTED_HOMEDIR}/Books"
- run_script 'env_set' 'MEDIADIR_MOVIES' "${DETECTED_HOMEDIR}/Movies"
- run_script 'env_set' 'MEDIADIR_MUSIC' "${DETECTED_HOMEDIR}/Music"
- run_script 'env_set' 'MEDIADIR_TV' "${DETECTED_HOMEDIR}/TV"
+ run_script 'env_set' 'MEDIADIR_BOOKS' "${ENVBOOKS}"
+ run_script 'env_set' 'MEDIADIR_MOVIES' "${ENVMOVIES}"
+ run_script 'env_set' 'MEDIADIR_MUSIC' "${ENVMUSIC}"
+ run_script 'env_set' 'MEDIADIR_TV' "${ENVTV}"
else
- run_menu 'input_prompt' 'MEDIADIR_BOOKS' "${DETECTED_HOMEDIR}/Books"
- run_menu 'input_prompt' 'MEDIADIR_MOVIES' "${DETECTED_HOMEDIR}/Movies"
- run_menu 'input_prompt' 'MEDIADIR_MUSIC' "${DETECTED_HOMEDIR}/Music"
- run_menu 'input_prompt' 'MEDIADIR_TV' "${DETECTED_HOMEDIR}/TV"
+ run_menu 'input_prompt' 'MEDIADIR_BOOKS' "${ENVBOOKS}"
+ run_menu 'input_prompt' 'MEDIADIR_MOVIES' "${ENVMOVIES}"
+ run_menu 'input_prompt' 'MEDIADIR_MUSIC' "${ENVMUSIC}"
+ run_menu 'input_prompt' 'MEDIADIR_TV' "${ENVTV}"
fi
}

diff:
@@ -11,7 +11,7 @@ timezone_set() {
run_script 'env_set' 'TZ' "${CURRENTTIMEZONE}"
else
whiptail --title "Time Zone" --fb --yesno --yes-button "OK" --no-button "Cancel" \
- "Your Current Time Zone is: ${CURRENTTIMEZONE} \\nThis will be passed into the applications.\\n\\nIf this is incorrect cancel now and change your system time zone!" 12 78
+ "Your Current Time Zone is: ${CURRENTTIMEZONE}\\n\\nThis will be passed into the applications.\\n\\nIf this is incorrect cancel now and change your system time zone!" 13 78
reset || true
run_script 'env_set' 'TZ' "${CURRENTTIMEZONE}"
fi

license: MIT License

repo: ghostwriters/dockstarter

original_message: GUI - Check .env file for set params


message: GUI - Minor cosmetic message change

diff:
@@ -9,7 +9,7 @@ config_folder_set() {
ENVDOCCONFDIR="${ENVDOCCONFDIR:-"${DETECTED_HOMEDIR}/.docker/config"}"
if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Configs Location" --fb --yesno \
- "The detected .env parameter or suggested place for config files is:\\n${ENVDOCCONFDIR}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 14 78); then
+ "The detected .env parameter or suggested location for config files is:\\n${ENVDOCCONFDIR}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 14 78); then
reset || true
#TODO - Check if the folder exists?
#TODO - Set permissions on the folder?

diff:
@@ -9,7 +9,7 @@ download_folder_set() {
ENVDOWNLOADSDIR="${ENVDOWNLOADSDIR:-"${DETECTED_HOMEDIR}/Downloads"}"
if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Dowloads Location" --fb --yesno \
- "The default place for download files is:\\n${ENVDOWNLOADSDIR}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 14 78); then
+ "The detected .env parameter or suggested location for download files is:\\n${ENVDOWNLOADSDIR}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 14 78); then
reset || true
#TODO - Should we check if the folder exists?
#TODO - Should we set permissions on the folder?

diff:
@@ -21,7 +21,7 @@ media_folders_set() {
ENVTV="${ENVTV:-"${DETECTED_HOMEDIR}/TV"}"
if [[ ${CI:-} != true ]] && [[ ${TRAVIS:-} != true ]] && (whiptail --title "Media Locations" --fb --yesno \
- "The detected .env parameter or suggested place for Media files is:\\nBooks = ${ENVBOOKS}\\nMovies = ${ENVMOVIES}\\nMusic = ${ENVMUSIC}\\nTV = ${ENVTV}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 17 78); then
+ "The detected .env parameter or suggested location for Media files is:\\nBooks = ${ENVBOOKS}\\nMovies = ${ENVMOVIES}\\nMusic = ${ENVMUSIC}\\nTV = ${ENVTV}\\n\\nThis will be passed into the applications.\\n\\nWould you like to accept this?" 17 78); then
reset || true
#TODO - Should we check if the folder exists?
#TODO - Should we set permissions on the folder?

original_message: GUI - Minor cosmetic message change


message: Added Bazarr arm64 and armhf images

change_type: ADD

diff:
+services:
+ bazarr:
+ image: morpheus65535/bazarr:arm64-latest

diff:
+services:
+ bazarr:
+ image: morpheus65535/bazarr:armhf-latest

original_message: Added Bazarr arm64 and armhf images


message: Adding arguments for advanced usage

diff:
@@ -20,6 +20,10 @@ IFS=$'\n\t'
#/ run docker-compose commands without confirmation prompts
#/ -e --env
#/ update your .env file with new variables
+#/ --env-get=<var>
+#/ get the value of a <var>iable in .env
+#/ --env-set=<var>,<val>
+#/ Set the <val>ue of a <var>iable in .env
#/ -h --help
#/ show this usage information
#/ -i --install
@@ -38,6 +42,10 @@ IFS=$'\n\t'
#/ update DockSTARTer to the latest commits from the specified branch
#/ -v --verbose
#/ verbose
+#/ --yml-get=<ymlvariable>
+#/ Gets the value of a <ymlpath> for the app in the yml path (must start with 'services.<appname>.')
+#/ --yml-get=<appname>,<ymlpath>
+#/ Gets the value of a <ymlvariable> for the app specified
#/ -x --debug
#/ debug
#/
@@ -62,6 +70,19 @@ cmdline() {
--compose) LOCAL_ARGS="${LOCAL_ARGS:-}-c " ;;
--debug) LOCAL_ARGS="${LOCAL_ARGS:-}-x " ;;
--env) LOCAL_ARGS="${LOCAL_ARGS:-}-e " ;;
+ --env-*)
+ readonly ENVMETHOD=${ARG%=*}
+ readonly ENVARG=${ARG#*=}
+ if [[ ${ENVMETHOD:-} == ${ENVARG:-} ]]; then
+ echo "Invalid usage. Must be on of the following:"
+ echo " --env-set with variable name ('--env-set=VAR,VAL') and value"
+ echo " --env-get with variable name ('--env-get=VAR')"
+ exit
+ else
+ readonly ENVVAR=${ENVARG%,*}
+ readonly ENVVAL=${ENVARG#*,}
+ fi
+ ;;
--help) LOCAL_ARGS="${LOCAL_ARGS:-}-h " ;;
--install) LOCAL_ARGS="${LOCAL_ARGS:-}-i " ;;
--prune) LOCAL_ARGS="${LOCAL_ARGS:-}-p " ;;
@@ -69,6 +90,19 @@ cmdline() {
--test) LOCAL_ARGS="${LOCAL_ARGS:-}-t " ;;
--update) LOCAL_ARGS="${LOCAL_ARGS:-}-u " ;;
--verbose) LOCAL_ARGS="${LOCAL_ARGS:-}-v " ;;
+ --yml-*)
+ readonly YMLMETHOD=${ARG%=*}
+ readonly YMLARG=${ARG#*=}
+ if [[ ${YMLMETHOD:-} == ${YMLARG:-} ]]; then
+ echo "Invalid usage. Must be one of the following:"
+ echo " --yml-get with variable name '--yml-get=<ymlpath>' (must start with 'services.<appname>.')"
+ echo " --yml-get with app name and variable name '--yml-get=<appname>,<ymlpath>'"
+ exit
+ else
+ YMLAPPNAME=${YMLARG%,*}
+ readonly YMLVAR=${YMLARG#*,}
+ fi
+ ;;
#pass through anything else
*)
[[ ${ARG:0:1} == "-" ]] || DELIM='"'
@@ -414,6 +448,48 @@ main() {
run_script "backup_${BACKUP}"
exit
fi
+ if [[ -n ${ENVMETHOD:-} ]]; then
+ case "${ENVMETHOD:-}" in
+ --env-get)
+ if [[ ${ENVVAR:-} != "" ]]; then
+ run_script 'env_get' "${ENVVAR}"
+ else
+ echo "Invalid usage. Must be"
+ echo " --env-get with variable name ('--env-get=VAR')"
+ fi
+ ;;
+ --env-set)
+ if [[ ${ENVVAR:-} != "" && ${ENVVAL:-} != "" ]]; then
+ run_script 'env_set' "${ENVVAR}" "${ENVVAL}"
+ else
+ echo "Invalid usage. Must be"
+ echo " --env-set with variable name and value ('--env-set=VAR,VAL')"
+ fi
+ ;;
+ *)
+ echo "Invalid option: '${ENVMETHOD:-}'"
+ ;;
+ esac
+ exit
+ fi
+ if [[ -n ${YMLMETHOD:-} ]]; then
+ if [[ ${YMLAPPNAME:-} == "${YMLVAR:-}" ]]; then
+ if [[ ${YMLVAR:-} != "" && ${YMLVAR:-} =~ services* ]]; then
+ YMLAPPNAME=${YMLVAR#services.}
+ YMLAPPNAME=${YMLAPPNAME%%.*}
+ else
+ YMLAPPNAME=""
+ fi
+ fi
+ if [[ ${YMLAPPNAME:-} != "" && ${YMLVAR:-} != "" ]]; then
+ run_script 'yml_get' "${YMLAPPNAME}" "${YMLVAR}" || error "Could not find '${YMLVAR}' in '${YMLAPPNAME}'"
+ else
+ echo "Invalid usage. Must be one of the following:"
+ echo " --yml-get with variable name '--yml-get=<ymlvar>' (must start with 'services.<appname>.')"
+ echo " --yml-get with app name and variable name '--yml-get=<appname>,<ymlvar>'"
+ fi
+ exit
+ fi
if [[ -n ${COMPOSE:-} ]]; then
case ${COMPOSE} in
down)

original_message: Adding arguments for advanced usage


message: Fix parameter expansion to find the first char

diff:
@@ -71,7 +71,7 @@ cmdline() {
--debug) LOCAL_ARGS="${LOCAL_ARGS:-}-x " ;;
--env) LOCAL_ARGS="${LOCAL_ARGS:-}-e " ;;
--env-*)
- readonly ENVMETHOD=${ARG%=*}
+ readonly ENVMETHOD=${ARG%%=*}
readonly ENVARG=${ARG#*=}
if [[ ${ENVMETHOD:-} == "${ENVARG:-}" ]]; then
echo "Invalid usage. Must be on of the following:"
@@ -79,7 +79,7 @@ cmdline() {
echo " --env-get with variable name ('--env-get=VAR')"
exit
else
- readonly ENVVAR=${ENVARG%,*}
+ readonly ENVVAR=${ENVARG%%,*}
readonly ENVVAL=${ENVARG#*,}
fi
;;
@@ -91,7 +91,7 @@ cmdline() {
--update) LOCAL_ARGS="${LOCAL_ARGS:-}-u " ;;
--verbose) LOCAL_ARGS="${LOCAL_ARGS:-}-v " ;;
--yml-*)
- readonly YMLMETHOD=${ARG%=*}
+ readonly YMLMETHOD=${ARG%%=*}
readonly YMLARG=${ARG#*=}
if [[ ${YMLMETHOD:-} == "${YMLARG:-}" ]]; then
echo "Invalid usage. Must be one of the following:"
@@ -99,7 +99,7 @@ cmdline() {
echo " --yml-get with app name and variable name '--yml-get=<appname>,<ymlpath>'"
exit
else
- YMLAPPNAME=${YMLARG%,*}
+ YMLAPPNAME=${YMLARG%%,*}
readonly YMLVAR=${YMLARG#*,}
fi
;;


message: Add API Token option

diff:
@@ -3,6 +3,7 @@ services:
labels:
com.dockstarter.appinfo.description: "Free service which will point a DNS to an IP of your choice"
com.dockstarter.appinfo.nicename: "CloudFlareDDNS"
+ com.dockstarter.appvars.cloudflareddns_apitoken: ""
com.dockstarter.appvars.cloudflareddns_apikey: ""
com.dockstarter.appvars.cloudflareddns_args: ""
com.dockstarter.appvars.cloudflareddns_detection_mode: "dig-google.com"

original_message: Add API Token option


message:
Add API Token option
Add API Token option to main yml for use

diff:
@@ -3,6 +3,7 @@ services:
container_name: cloudflareddns
environment:
- ARGS=${CLOUDFLAREDDNS_ARGS}
+ - CF_APITOKEN=${CLOUDFLAREDDNS_APITOKEN}
- CF_APIKEY=${CLOUDFLAREDDNS_APIKEY}
- CF_HOSTS=${CLOUDFLAREDDNS_HOSTS}
- CF_RECORDTYPES=${CLOUDFLAREDDNS_RECORDTYPES}


message:
Update CloudflareDDNS documentation
Point users to the container's documentation

diff:
# CloudFlareDDNS
-## Update Frequency
+## Documentation
-Every 5 minutes or when the container restarts.
-
-[Source](https://github.com/oznu/docker-cloudflare-ddns/issues/11)
+Documentation for settings and use can be found at https://github.com/oznu/docker-cloudflare-ddns


message: Update PROMT="FORCED" when force flag used

diff:
@@ -370,6 +370,9 @@ main() {
fi
# Repo Check
local PROMPT
+ if [[ ${FORCE:-} == true ]]; then
+ PROMPT="FORCED"
+ fi
local DS_COMMAND
DS_COMMAND=$(command -v ds || true)
if [[ -L ${DS_COMMAND} ]]; then
@@ -482,7 +485,9 @@ main() {
exit
fi
# Run Menus
+ if [[ ${PROMPT:-} != "FORCED" ]]; then
PROMPT="GUI"
+ fi
run_script 'menu_main'
}
main


message:
Move PROMPT check into question_prompt script
Add check if PROMPT="FORCED"

diff:
@@ -17,9 +17,6 @@ appvars_purge() {
fi
local PREPROMPT=${PROMPT:-}
- if [[ ${CI:-} != true ]] && [[ ${PROMPT:-} != "GUI" ]]; then
- PROMPT="CLI"
- fi
if [[ ${CI:-} == true ]] || run_script 'question_prompt' "${PROMPT:-}" N "Would you like to purge these settings for ${APPNAME}?\\n\\n${APPVARS}"; then
info "Purging ${APPNAME} .env variables."
sed -i "/^${APPNAME}_/d" "${SCRIPTPATH}/compose/.env" || fatal "Failed to purge ${APPNAME} variables."

diff:
@@ -5,9 +5,6 @@ IFS=$'\n\t'
appvars_purge_all() {
if grep -q '_ENABLED=false$' "${SCRIPTPATH}/compose/.env"; then
local PREPROMPT=${PROMPT:-}
- if [[ ${CI:-} != true ]] && [[ ${PROMPT:-} != "GUI" ]]; then
- PROMPT="CLI"
- fi
if [[ ${CI:-} == true ]] || run_script 'question_prompt' "${PROMPT:-}" N "Would you like to purge variables for all disabled apps?"; then
info "Purging disabled app variables."
while IFS= read -r line; do

diff:
@@ -7,6 +7,9 @@ question_prompt() {
local DEFAULT=${2:-Y}
local QUESTION=${3:-}
local YN
+ if [[ ${PROMPT:-} != "FORCED" ]] && [[ ${PROMPT:-} != "GUI" ]]; then
+ PROMPT="CLI"
+ fi
while true; do
if [[ ${CI:-} == true ]]; then
YN=${DEFAULT}


message: Change FORCED to FORCE

diff:
@@ -7,7 +7,7 @@ question_prompt() {
local DEFAULT=${2:-Y}
local QUESTION=${3:-}
local YN
- if [[ ${PROMPT:-} != "FORCED" ]] && [[ ${PROMPT:-} != "GUI" ]]; then
+ if [[ ${PROMPT:-} != "FORCE" ]] && [[ ${PROMPT:-} != "GUI" ]]; then
PROMPT="CLI"
fi
while true; do

diff:
@@ -371,7 +371,7 @@ main() {
# Repo Check
local PROMPT
if [[ ${FORCE:-} == true ]]; then
- PROMPT="FORCED"
+ PROMPT="FORCE"
fi
local DS_COMMAND
DS_COMMAND=$(command -v ds || true)
@@ -485,7 +485,7 @@ main() {
exit
fi
# Run Menus
- if [[ ${PROMPT:-} != "FORCED" ]]; then
+ if [[ ${PROMPT:-} != "FORCE" ]]; then
PROMPT="GUI"
fi
run_script 'menu_main'

original_message: Change FORCED to FORCE


message:
Update question prompt logic
PROMPT="CLI" if not set
Remove now redundant check
Add explicit check for PROMPT="FORCE"

diff:
@@ -3,13 +3,10 @@ set -euo pipefail
IFS=$'\n\t'
question_prompt() {
- local PROMPT=${1:-}
+ local PROMPT=${1:-CLI}
local DEFAULT=${2:-Y}
local QUESTION=${3:-}
local YN
- if [[ ${PROMPT:-} != "FORCE" ]] && [[ ${PROMPT:-} != "GUI" ]]; then
- PROMPT="CLI"
- fi
while true; do
if [[ ${CI:-} == true ]]; then
YN=${DEFAULT}
@@ -33,6 +30,8 @@ question_prompt() {
else
YN=N
fi
+ elif [[ ${PROMPT:-} == "FORCE" ]]; then
+ YN=${DEFAULT}
else
YN=${DEFAULT}
fi

original_message:
Update question prompt logic
- PROMPT="CLI" if not set
- Remove now redundant check
- Add explicit check for PROMPT="FORCE"


message: Initial commit for SyncLounge documentation

diff:
+# SyncLounge
+
+[SyncLounge](https://synclounge.tv/) sets up client and server applications to allow you to enjoy Plex with your friends, synchronizing the playback between players.
+
+The GIT Repository for SyncLounge is located at [https://github.com/samcm/synclounge](https://github.com/samcm/synclounge).
+
+## General Setup
+
+SyncLounge requires that you have a domain to use and due to some issues (see **Issues** section below) . It is recommended that you use this with the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container supported by DockSTARTer.
+
+The below steps assume that you already have the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container selected, configured, and running. If not, do that first.
+
+1. Select SyncLounge from the DockSTARTer menu
+ Note: If this is your first time running and configuring SyncLounge, keep the default settings. If you want to change these, see the **Issues** and **Advanced** sections below.
+2. Copy and paste the following into a file called `synclounge.subdomain.conf` in your [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) `proxy-confs` folder.
+ ```nginx
+ server {
+ listen 443 ssl;
+ listen [::]:443 ssl;
+
+ server_name synclounge.*;
+
+ include /config/nginx/ssl.conf;
+
+ client_max_body_size 0;
+ proxy_redirect off;
+ proxy_buffering off;
+
+ ###
+ # Client
+ ###
+
+ # Redirect root to SyncLounge's base url (web root)
+ location = / {
+ return 301 $scheme://$host/lounge;
+ }
+
+ # Proxy for the client
+ location /lounge {
+ include /config/nginx/proxy.conf;
+ resolver 127.0.0.11 valid=30s;
+ set $upstream_app synclounge;
+ set $upstream_port 8088;
+ set $upstream_proto http;
+
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_pass $upstream_proto://$upstream_app:$upstream_port;
+ }
+
+ # Due to a bug in SyncLounge, some requests like /config don't respect the base url (web root) setting
+ location / {
+ include /config/nginx/proxy.conf;
+ resolver 127.0.0.11 valid=30s;
+ set $upstream_app synclounge;
+ set $upstream_port 8088;
+ set $upstream_proto http;
+
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_pass $upstream_proto://$upstream_app:$upstream_port;
+ }
+
+ # Invite links need to be rewritten to use the base url (web root) setting
+ location /invite/ {
+ return 301 $scheme://$host/lounge$request_uri;
+ }
+
+ ###
+ # Server
+ ###
+
+ # Proxy for the server
+ location /server {
+ include /config/nginx/proxy.conf;
+ resolver 127.0.0.11 valid=30s;
+ set $upstream_app synclounge;
+ set $upstream_port 8089;
+ set $upstream_proto http;
+
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_pass $upstream_proto://$upstream_app:$upstream_port;
+ }
+
+ # Due to a bug in SyncLounge, some websockets calls don't respect the base url (server root) setting
+ location /socket.io {
+ resolver 127.0.0.11 valid=30s;
+ set $upstream_app synclounge;
+ set $upstream_port 8089;
+ set $upstream_proto http;
+
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_pass $upstream_proto://$upstream_app:$upstream_port/server/socket.io/;
+ }
+
+ }
+ ```
+1. Restart the letsencrypt container
+ `docker restart letsencrypt`
+
+You should now be able to go to `synclouge.yourdomain.com` and use SyncLounge!
+
+## Issues
+
+There are a number of issues found when setting this up.
+1. The docker container doesn't properly respect `web_root` and `server_root` settings for some paths. These are noted in the sample nginx config above.
+2. Auto Join has a bug that causes it to not work most of the time.
+3. Some of the settings are a bit finicky. For instance, `web_root` and `server_root` don't like to be set to `/` and they if they are empty, they will get set to defaults `/slweb` and `/slserver`.
+
+## Advanced
+
+Read **Issues** above first.
+
+If you change either `web_root` and `server_root`, **DO NOT** include the leading `/`. This is handled for you.
+
+When changing any of the settings on the container, you need to make sure to change the respective values in the nginx configuratiion above. Example: You change `web_root` to `web` the you will need to change `lounge` in the configuration to `web`.
\ No newline at end of file

diff:
@@ -120,6 +120,7 @@ nav:
- SiCKRAGE: apps/sickrage.md
- SmokePing: apps/smokeping.md
- Sonarr: apps/sonarr.md
+ - SyncLounge: apps/synclounge.md
- Syncthing: apps/syncthing.md
- Tautulli: apps/tautulli.md
- Telegraf: apps/telegraf.md


message: Initial commit of SyncLounge

diff:
+services:
+ synclounge:
+ image: starbix/synclounge

diff:
+services:
+ synclounge:
+ hostname: ${DOCKERHOSTNAME}

diff:
+services:
+ synclounge:
+ labels:
+ com.dockstarter.appinfo.description: "(Read the docs for setup) Watch Plex in sync with your friends/family, wherever you are."
+ com.dockstarter.appinfo.nicename: "SyncLounge"
+ com.dockstarter.appvars.synclounge_enabled: "false"
+ com.dockstarter.appvars.synclounge_network_mode: ""
+ com.dockstarter.appvars.synclounge_port_8088: "8088"
+ com.dockstarter.appvars.synclounge_port_8089: "8089"
+ com.dockstarter.appvars.synclounge_domain: "synclounge.yourdomain.com"
+ com.dockstarter.appvars.synclounge_auto_join: "true"
+ com.dockstarter.appvars.synclounge_web_root: "lounge"
+ com.dockstarter.appvars.synclounge_server_root: "server"

diff:
+services:
+ synclounge:
+ network_mode: ${SYNCLOUNGE_NETWORK_MODE}

diff:
+services:
+ synclounge:
+ ports:
+ - ${SYNCLOUNGE_PORT_8088}:8088
+ - ${SYNCLOUNGE_PORT_8089}:8089
\ No newline at end of file

diff:
+services:
+ synclounge:
+ container_name: synclounge
+ environment:
+ - PGID=${PGID}
+ - PUID=${PUID}
+ - TZ=${TZ}
+ - DOMAIN=${SYNCLOUNGE_DOMAIN}
+ - accessUrl=https://${SYNCLOUNGE_DOMAIN}/${SYNCLOUNGE_WEB_ROOT}
+ - autoJoin=${SYNCLOUNGE_AUTO_JOIN}
+ - autoJoinServer=https://${SYNCLOUNGE_DOMAIN}/${SYNCLOUNGE_SERVER_ROOT}
+ - webroot=/${SYNCLOUNGE_WEB_ROOT}
+ - serverroot=/${SYNCLOUNGE_SERVER_ROOT}
+ logging:
+ driver: json-file
+ options:
+ max-file: ${DOCKERLOGGING_MAXFILE}
+ max-size: ${DOCKERLOGGING_MAXSIZE}
+ restart: unless-stopped
+ volumes:
+ - /etc/localtime:/etc/localtime:ro

original_message: Initial commit of SyncLounge


message: Linting and minor changes

diff:
@@ -13,6 +13,7 @@ The below steps assume that you already have the [Let's Encrypt](https://docksta
1. Select SyncLounge from the DockSTARTer menu
Note: If this is your first time running and configuring SyncLounge, keep the default settings. If you want to change these, see the **Issues** and **Advanced** sections below.
2. Copy and paste the following into a file called `synclounge.subdomain.conf` in your [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) `proxy-confs` folder.
+
```nginx
server {
listen 443 ssl;
@@ -101,14 +102,16 @@ The below steps assume that you already have the [Let's Encrypt](https://docksta
}
```
-1. Restart the letsencrypt container
+
+3. Restart the letsencrypt container
`docker restart letsencrypt`
You should now be able to go to `synclouge.yourdomain.com` and use SyncLounge!
## Issues
-There are a number of issues found when setting this up.
+These are some issue found when setting this up.
+
1. The docker container doesn't properly respect `web_root` and `server_root` settings for some paths. These are noted in the sample nginx config above.
2. Auto Join has a bug that causes it to not work most of the time.
3. Some of the settings are a bit finicky. For instance, `web_root` and `server_root` don't like to be set to `/` and they if they are empty, they will get set to defaults `/slweb` and `/slserver`.

original_message: Linting and minor changes


message: Remove ARM yml

change_type: DELETE

diff:
-services:
- synclounge:
- image: starbix/synclounge

original_message: Remove ARM yml


message: Change main yml to use unique setting per variable

diff:
@@ -3,11 +3,13 @@ services:
labels:
com.dockstarter.appinfo.description: "(Read the docs for setup) Watch Plex in sync with your friends/family, wherever you are."
com.dockstarter.appinfo.nicename: "SyncLounge"
+ com.dockstarter.appvars.synclounge_access_url: "http(s)://your-synclounge-domain/web_root"
+ com.dockstarter.appvars.synclounge_auto_join: "false"
+ com.dockstarter.appvars.synclounge_auto_join_server: "http(s)://your-synclounge-domain/server_root"
+ com.dockstarter.appvars.synclounge_domain: "your-synclounge-domain"
com.dockstarter.appvars.synclounge_enabled: "false"
com.dockstarter.appvars.synclounge_network_mode: ""
com.dockstarter.appvars.synclounge_port_8088: "8088"
com.dockstarter.appvars.synclounge_port_8089: "8089"
- com.dockstarter.appvars.synclounge_auto_join: "true"
- com.dockstarter.appvars.synclounge_domain: "synclounge.yourdomain.com"
- com.dockstarter.appvars.synclounge_server_root: "server"
- com.dockstarter.appvars.synclounge_web_root: "lounge"
+ com.dockstarter.appvars.synclounge_server_root: "/server"
+ com.dockstarter.appvars.synclounge_web_root: "/lounge"

diff:
@@ -6,11 +6,11 @@ services:
- PUID=${PUID}
- TZ=${TZ}
- DOMAIN=${SYNCLOUNGE_DOMAIN}
- - accessUrl=https://${SYNCLOUNGE_DOMAIN}/${SYNCLOUNGE_WEB_ROOT}
+ - accessUrl=${SYNCLOUNGE_ACCESS_URL}
- autoJoin=${SYNCLOUNGE_AUTO_JOIN}
- - autoJoinServer=https://${SYNCLOUNGE_DOMAIN}/${SYNCLOUNGE_SERVER_ROOT}
- - webroot=/${SYNCLOUNGE_WEB_ROOT}
- - serverroot=/${SYNCLOUNGE_SERVER_ROOT}
+ - autoJoinServer=${SYNCLOUNGE_AUTO_JOIN_SERVER}
+ - webroot=${SYNCLOUNGE_WEB_ROOT}
+ - serverroot=${SYNCLOUNGE_SERVER_ROOT}
logging:
driver: json-file
options:


message: Remove my custom settings for base urls

diff:
@@ -11,5 +11,5 @@ services:
com.dockstarter.appvars.synclounge_network_mode: ""
com.dockstarter.appvars.synclounge_port_8088: "8088"
com.dockstarter.appvars.synclounge_port_8089: "8089"
- com.dockstarter.appvars.synclounge_server_root: "/server"
- com.dockstarter.appvars.synclounge_web_root: "/lounge"
+ com.dockstarter.appvars.synclounge_server_root: ""
+ com.dockstarter.appvars.synclounge_web_root: ""

original_message: Remove my custom settings for base urls


message:
Update the documentation
Reflect new proxy confs that are now in LSIO
Change some wording and information

diff:
@@ -6,104 +6,16 @@ The GIT Repository for SyncLounge is located at [https://github.com/samcm/synclo
## General Setup
-SyncLounge requires that you have a domain to use and due to some issues (see **Issues** section below) . It is recommended that you use this with the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container supported by DockSTARTer.
+SyncLounge works best if you have a domain to use and due to some issues (see **Issues** section below) it is recommended that you use this with the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container supported by DockSTARTer.
-The below steps assume that you already have the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container selected, configured, and running. If not, do that first.
+The below steps assume that you already have the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container selected, configured, and running. If not, do that first or along with steps 1 & 2 below.
1. Select SyncLounge from the DockSTARTer menu
Note: If this is your first time running and configuring SyncLounge, keep the default settings. If you want to change these, see the **Issues** and **Advanced** sections below.
-2. Copy and paste the following into a file called `synclounge.subdomain.conf` in your [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) `proxy-confs` folder.
-
- ```nginx
- server {
- listen 443 ssl;
- listen [::]:443 ssl;
-
- server_name synclounge.*;
-
- include /config/nginx/ssl.conf;
-
- client_max_body_size 0;
- proxy_redirect off;
- proxy_buffering off;
-
- ###
- # Client
- ###
-
- # Redirect root to SyncLounge's base url (web root)
- location = / {
- return 301 $scheme://$host/lounge;
- }
-
- # Proxy for the client
- location /lounge {
- include /config/nginx/proxy.conf;
- resolver 127.0.0.11 valid=30s;
- set $upstream_app synclounge;
- set $upstream_port 8088;
- set $upstream_proto http;
-
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
-
- proxy_pass $upstream_proto://$upstream_app:$upstream_port;
- }
-
- # Due to a bug in SyncLounge, some requests like /config don't respect the base url (web root) setting
- location / {
- include /config/nginx/proxy.conf;
- resolver 127.0.0.11 valid=30s;
- set $upstream_app synclounge;
- set $upstream_port 8088;
- set $upstream_proto http;
-
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
-
- proxy_pass $upstream_proto://$upstream_app:$upstream_port;
- }
-
- # Invite links need to be rewritten to use the base url (web root) setting
- location /invite/ {
- return 301 $scheme://$host/lounge$request_uri;
- }
-
- ###
- # Server
- ###
-
- # Proxy for the server
- location /server {
- include /config/nginx/proxy.conf;
- resolver 127.0.0.11 valid=30s;
- set $upstream_app synclounge;
- set $upstream_port 8089;
- set $upstream_proto http;
-
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
-
- proxy_pass $upstream_proto://$upstream_app:$upstream_port;
- }
-
- # Due to a bug in SyncLounge, some websockets calls don't respect the base url (server root) setting
- location /socket.io {
- resolver 127.0.0.11 valid=30s;
- set $upstream_app synclounge;
- set $upstream_port 8089;
- set $upstream_proto http;
-
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
-
- proxy_pass $upstream_proto://$upstream_app:$upstream_port/server/socket.io/;
- }
-
- }
- ```
-
-3. Restart the letsencrypt container
+2. Complete the DockSTARTer configuration and run Docker Compose.
+ Note: If you change either `web_root` and `server_root`, **DO NOT** include the leading `/`. This is handled for you.
+3. Find the file called `synclounge.subdomain.conf.sample` in your [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) `proxy-confs` folder and rename it to `synclounge.subdomain.conf`.
+4. Restart the letsencrypt container
`docker restart letsencrypt`
You should now be able to go to `synclouge.yourdomain.com` and use SyncLounge!
@@ -112,14 +24,12 @@ You should now be able to go to `synclouge.yourdomain.com` and use SyncLounge!
These are some issue found when setting this up.
-1. The docker container doesn't properly respect `web_root` and `server_root` settings for some paths. These are noted in the sample nginx config above.
+1. The application doesn't properly respect `web_root` and `server_root` settings for some paths. These are noted in the sample nginx config.
2. Auto Join has a bug that causes it to not work most of the time.
-3. Some of the settings are a bit finicky. For instance, `web_root` and `server_root` don't like to be set to `/` and they if they are empty, they will get set to defaults `/slweb` and `/slserver`.
+3. Some of the settings are a bit finicky. For instance, `server_root` doesn't currently like to be set to `/`. If it is empty, it will get set to default `/slserver`.
## Advanced
Read **Issues** above first.
-If you change either `web_root` and `server_root`, **DO NOT** include the leading `/`. This is handled for you.
-
-When changing any of the settings on the container, you need to make sure to change the respective values in the nginx configuratiion above. Example: You change `web_root` to `web` the you will need to change `lounge` in the configuration to `web`.
+When changing any of the settings on the container, you need to make sure to change the respective values in the nginx configuratiion above. Example: You change `web_root` to `web` the you will need to change `location / {` in the configuration to `location /web {`.

original_message:
Update the documentation
- Reflect new proxy confs that are now in LSIO
- Change some wording and information


message: Updates for LSIO SyncLounge container testing

diff:
services:
synclounge:
labels:
- com.dockstarter.appinfo.description: "(Read the docs for setup) Watch Plex in sync with your friends/family, wherever you are."
+ com.dockstarter.appinfo.description: "Watch Plex in sync with your friends/family, wherever you are."
com.dockstarter.appinfo.nicename: "SyncLounge"
- com.dockstarter.appvars.synclounge_access_url: "http(s)://your-synclounge-domain/web_root"
- com.dockstarter.appvars.synclounge_auto_join: "false"
- com.dockstarter.appvars.synclounge_auto_join_server: "http(s)://your-synclounge-domain/server_root"
- com.dockstarter.appvars.synclounge_domain: "your-synclounge-domain"
- com.dockstarter.appvars.synclounge_enabled: "false"
+ com.dockstarter.appvars.synclounge_autojoin_enabled: "false"
+ com.dockstarter.appvars.synclounge_autojoin_room: ""
+ com.dockstarter.appvars.synclounge_autojoin_password: ""
+ com.dockstarter.appvars.synclounge_external_url: ""
+ com.dockstarter.appvars.synclounge_external_port: ""
com.dockstarter.appvars.synclounge_network_mode: ""
com.dockstarter.appvars.synclounge_port_8088: "8088"
com.dockstarter.appvars.synclounge_port_8089: "8089"
- com.dockstarter.appvars.synclounge_server_root: ""
- com.dockstarter.appvars.synclounge_web_root: ""

diff:
services:
synclounge:
+ image: lsiodev/synclounge # This will change after testing
container_name: synclounge
environment:
- - PGID=${PGID}
- - PUID=${PUID}
- TZ=${TZ}
- - DOMAIN=${SYNCLOUNGE_DOMAIN}
- - accessUrl=${SYNCLOUNGE_ACCESS_URL}
- - autoJoin=${SYNCLOUNGE_AUTO_JOIN}
- - autoJoinServer=${SYNCLOUNGE_AUTO_JOIN_SERVER}
- - webroot=${SYNCLOUNGE_WEB_ROOT}
- - serverroot=${SYNCLOUNGE_SERVER_ROOT}
+ - EXTERNAL_URL=${SYNCLOUNGE_EXTERNAL_URL}
+ - EXTERNAL_SERVER_PORT=${SYNCLOUNGE_EXTERNAL_SERVER_PORT}
+ - WEB_ROOT=${SYNCLOUNGE_WEB_ROOT}
+ - AUTH_LIST=${SYNCLOUNGE_AUTH_LIST}
+ - AUTOJOIN_ENABLED=${SYNCLOUNGE_AUTOJOIN_ENABLED}
+ - AUTOJOIN_ROOM=${SYNCLOUNGE_AUTOJOIN_ROOM}
+ - AUTOJOIN_PASSWORD=${SYNCLOUNGE_AUTOJOIN_PASSWORD}
logging:
driver: json-file
options:


message: Update SyncLounge documentation

diff:
The GIT Repository for SyncLounge is located at [https://github.com/samcm/synclounge](https://github.com/samcm/synclounge).
+The GIT Repository for the LSIO SyncLounge container is located at [https://github.com/linuxserver/docker-synclounge](https://github.com/linuxserver/docker-synclounge).
+
## General Setup
-SyncLounge works best if you have a domain to use and due to some issues (see **Issues** section below) it is recommended that you use this with the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container supported by DockSTARTer.
+SyncLounge works best if you have a domain to use and it is recommended that you use this with the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container supported by DockSTARTer.
The below steps assume that you already have the [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) container selected, configured, and running. If not, do that first or along with steps 1 & 2 below.
1. Select SyncLounge from the DockSTARTer menu
- Note: If this is your first time running and configuring SyncLounge, keep the default settings. If you want to change these, see the **Issues** and **Advanced** sections below.
-2. Complete the DockSTARTer configuration and run Docker Compose.
- Note: If you change either `web_root` and `server_root`, **DO NOT** include the leading `/`. This is handled for you.
-3. Find the file called `synclounge.subdomain.conf.sample` in your [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) `proxy-confs` folder and rename it to `synclounge.subdomain.conf`.
-4. Restart the letsencrypt container
+
+ Note: If this is your first time running and configuring SyncLounge, keep the default settings to make sure everything works before making modifications
+
+1. Complete the DockSTARTer configuration and run Docker Compose.
+1. Find the file called `synclounge.subdomain.conf.sample` in your [Let's Encrypt](https://dockstarter.com/apps/letsencrypt/) `proxy-confs` folder and rename it to `synclounge.subdomain.conf`.
+1. Restart the letsencrypt container
`docker restart letsencrypt`
-You should now be able to go to `synclouge.yourdomain.com` and use SyncLounge!
+You should now be able to go to `synclouge.yourdomain.tld` and use SyncLounge!
-## Issues
+## Advanced
-These are some issue found when setting this up.
+### Override Servers List
-1. The application doesn't properly respect `web_root` and `server_root` settings for some paths. These are noted in the sample nginx config.
-2. Auto Join has a bug that causes it to not work most of the time.
-3. Some of the settings are a bit finicky. For instance, `server_root` doesn't currently like to be set to `/`. If it is empty, it will get set to default `/slserver`.
+If you want to override the Servers List you'll need to create an [Override](https://dockstarter.com/advanced/overrides/) to mount your servers file.
-## Advanced
+1. Create a file called `servers.json` in your SyncLounge folder and [populate it with servers](http://docs.synclounge.tv/self-hosted/settings/#customize-the-entire-list).
+
+ Note: Your servers.json file should NOT include `"servers": `. Only `[]` and the server objects inside.
+
+1. Add or update your overrides file to include the example below
+1. Restart your SyncLounge container: `docker restart synclounge`
-Read **Issues** above first.
+#### Example
-When changing any of the settings on the container, you need to make sure to change the respective values in the nginx configuratiion above. Example: You change `web_root` to `web` the you will need to change `location / {` in the configuration to `location /web {`.
+```yaml
+version: "3.4" # this must match the version in docker-compose.yml
+services:
+ synclounge:
+ volumes:
+ - ${DOCKERSHAREDDIR}/synclounge/servers.json:/defaults/servers.json
+```

original_message: Update SyncLounge documentation


message: Reorder ENV list to match label order

diff:
@@ -4,13 +4,12 @@ services:
container_name: synclounge
environment:
- TZ=${TZ}
- - EXTERNAL_URL=${SYNCLOUNGE_EXTERNAL_URL}
- - EXTERNAL_SERVER_PORT=${SYNCLOUNGE_EXTERNAL_SERVER_PORT}
- - WEB_ROOT=${SYNCLOUNGE_WEB_ROOT}
- AUTH_LIST=${SYNCLOUNGE_AUTH_LIST}
- AUTOJOIN_ENABLED=${SYNCLOUNGE_AUTOJOIN_ENABLED}
- AUTOJOIN_ROOM=${SYNCLOUNGE_AUTOJOIN_ROOM}
- AUTOJOIN_PASSWORD=${SYNCLOUNGE_AUTOJOIN_PASSWORD}
+ - EXTERNAL_URL=${SYNCLOUNGE_EXTERNAL_URL}
+ - EXTERNAL_SERVER_PORT=${SYNCLOUNGE_EXTERNAL_SERVER_PORT}
logging:
driver: json-file
options:

original_message: Reorder ENV list to match label order


message: Move image to the right place, add arch and arm

diff:
+services:
+ synclounge:
+ image: lsiodev/synclounge # This will change after testing

diff:
services:
synclounge:
- image: starbix/synclounge
+ image: lsiodev/synclounge # This will change after testing

diff:
services:
synclounge:
- image: lsiodev/synclounge # This will change after testing
container_name: synclounge
environment:
- TZ=${TZ}


message: Add required label back

diff:
@@ -7,6 +7,7 @@ services:
com.dockstarter.appvars.synclounge_autojoin_enabled: "false"
com.dockstarter.appvars.synclounge_autojoin_room: ""
com.dockstarter.appvars.synclounge_autojoin_password: ""
+ com.dockstarter.appvars.synclounge_enabled: ""
com.dockstarter.appvars.synclounge_external_url: ""
com.dockstarter.appvars.synclounge_external_server_port: ""
com.dockstarter.appvars.synclounge_network_mode: ""

original_message: Add required label back


message: Alpha sort env

diff:
@@ -2,13 +2,13 @@ services:
synclounge:
container_name: synclounge
environment:
- - TZ=${TZ}
- AUTH_LIST=${SYNCLOUNGE_AUTH_LIST}
- AUTOJOIN_ENABLED=${SYNCLOUNGE_AUTOJOIN_ENABLED}
- - AUTOJOIN_ROOM=${SYNCLOUNGE_AUTOJOIN_ROOM}
- AUTOJOIN_PASSWORD=${SYNCLOUNGE_AUTOJOIN_PASSWORD}
- - EXTERNAL_URL=${SYNCLOUNGE_EXTERNAL_URL}
+ - AUTOJOIN_ROOM=${SYNCLOUNGE_AUTOJOIN_ROOM}
- EXTERNAL_SERVER_PORT=${SYNCLOUNGE_EXTERNAL_SERVER_PORT}
+ - EXTERNAL_URL=${SYNCLOUNGE_EXTERNAL_URL}
+ - TZ=${TZ}
logging:
driver: json-file
options:

original_message: Alpha sort env


message: LSIO SyncLounge container is live!

diff:
services:
synclounge:
- image: lsiodev/synclounge # This will change after testing
+ image: linuxserver/synclounge

original_message: LSIO SyncLounge container is live!


message: Fix Advanced section steps

diff:
@@ -42,7 +42,7 @@ If you want to override the Servers List you'll need to create an [Override](htt
Note: Your servers.json file should NOT include `"servers":` prefix (that is for the settings file which isn't used here). Only `[]` and the server objects inside should be included.
1. Add or update your overrides file to include the example below
-1. Restart your SyncLounge container: `docker restart synclounge`
+1. Run docker compose: `ds -c`
#### Example

original_message: Fix Advanced section steps


message:
Update synclounge.md
Fix path in example override

diff:
@@ -51,5 +51,5 @@ version: "3.4" # this must match the version in docker-compose.yml
services:
synclounge:
volumes:
- - ${DOCKERSHAREDDIR}/synclounge/servers.json:/defaults/servers.json
+ - ${DOCKERCONFDIR}/synclounge/servers.json:/defaults/servers.json
```


message: Also run CI on Ubuntu 20.04

diff:
@@ -30,7 +30,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-16.04, ubuntu-18.04]
+ os: [ubuntu-16.04, ubuntu-18.04, ubuntu-20.04]
steps:
- uses: actions/checkout@v2.3.2
- name: run

original_message: Also run CI on Ubuntu 20.04


message: Also add ubuntu-latest

diff:
@@ -30,7 +30,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-16.04, ubuntu-18.04, ubuntu-20.04]
+ os: [ubuntu-16.04, ubuntu-18.04, ubuntu-20.04, ubuntu-latest]
steps:
- uses: actions/checkout@v2.3.2
- name: run

original_message: Also add ubuntu-latest


message:
Change default PiHole Server IP to 0.0.0.0
* Change default PiHole Server IP to 0.0.0.0
This is a possible solution for
* Remove outdated Pi-Hole instructions
* Write new Pi-hole documentation
* Reword the Pi-hole documentation
* I like this wording better actually

diff:
@@ -10,5 +10,5 @@ services:
com.dockstarter.appvars.pihole_port_53: "53"
com.dockstarter.appvars.pihole_port_67: "67"
com.dockstarter.appvars.pihole_port_80: "8008"
- com.dockstarter.appvars.pihole_serverip: "192.168.x.x"
+ com.dockstarter.appvars.pihole_serverip: "0.0.0.0"
com.dockstarter.appvars.pihole_webpassword: ""

diff:
## Description
-[Pi-hole](https://pi-hole.net/) takes over the local DNS service and may conflict with existing DNS services on your server. Ubuntu 18.04 currently uses systemd-resolv to server DNS and needs to be configured to either give up port 53 or be disabled.
+[Pi-hole](https://pi-hole.net/) is a DNS server that is used to filter out advertisements and other unwanted content on a network-wide level.
-### Netplan Setup
+### Pi-hole Server IP Setup
-On Ubuntu 18.04 and newer you will have `netplan` controlling your network. You can search [their site](https://netplan.io/) for examples on how to configure it. You need to set your nameserver to use your LAN's DNS or a public DNS such as `1.1.1.1` before proceeding with any instructions below.
-
-### Resolvconf
-
-On Ubuntu 18.04, resolvconf was removed as the default means to control DNS. In addition to the settings mentioned regarding netplan, we recommend setting up resolvconf.
-
-To install `resolvconf` run:
-
-```bash
-sudo apt install resolvconf
-```
-
-- Edit `/etc/resolvconf/resolv.conf.d/head` using sudo and enter `nameserver 1.1.1.1` on the first uncommented line.
-
-Restart the `resolvconf` service:
-
-```bash
-sudo service resolvconf restart
-```
-
-### Stop systemd-resolv from listening on port 53
-
-Edit `/etc/systemd/resolved.conf` and set `DNSStubListener=no` (make sure it is not commented out with a `#` at the beginning of the line) and then run:
-
-```bash
-sudo systemctl restart systemd-resolved
-```
-
-If that does not work you can try the following:
-
-### Stop and disable systemd-resolv (only if the above does not work)
-
-```bash
-sudo systemctl stop systemd-resolv.service
-sudo systemctl disable systemd-resolv.service
-```
-
-### Name resolution for localhost
-
-In most cases it might be required to set your localhost name in `/etc/hosts`
-
-```hosts
-127.0.0.1 machinename.localhost machinename
-127.0.0.1 domain.com
-```
+By default, Pi-hole is configured to bind to `0.0.0.0` on port 53. While this configuration should work out of the box for many people, if you encounter issues with this, it is recommended that you set the `PIHOLE_SERVER_IP` variable to your server's IP address (e.g. 192.168.1.5). If you still encounter difficulties getting Pi-hole to work, you may need to disable or reconfigure any conflicting services running on port 53, such as `systemd-resolved`. Although this is a more advanced configuration, you can also configure systemd-resolved to not listen on port 53 by setting `DNSStubListener=no` in `/etc/systemd/resolved.conf`.

original_message:
Change default PiHole Server IP to 0.0.0.0 (#1057)

* Change default PiHole Server IP to 0.0.0.0

This is a possible solution for #1056

* Remove outdated Pi-Hole instructions

* Write new Pi-hole documentation

* Reword the Pi-hole documentation

* I like this wording better actually

Co-authored-by: Eric Nemchik <eric@nemchik.com>


message: Spelling; noobie -> newbie

diff:
@@ -53,7 +53,7 @@ which will show you that Google Chrome is using the port you need. In this case
We have had a recent influx of users asking for assistance in how to make OMV work with DockSTARTer (DS). DS staff have tested and confirmed the following installation method on OMV version 5.5.
-If you are a Linux noobie, we *strongly discourage* this approach because of all the issues that might arise with how OMV is built, and troubleshooting issues in OMV can be a pain. However, if you feel comfortable with Linux and want to continue down this route you will need to ensure the following:
+If you are a Linux newbie, we *strongly discourage* this approach because of all the issues that might arise with how OMV is built, and troubleshooting issues in OMV can be a pain. However, if you feel comfortable with Linux and want to continue down this route you will need to ensure the following:
1. You have installed all the necessary updates that are pending in your system.

original_message: Spelling; noobie -> newbie (#1063)


message:
[minor] Fix strange capitalization and wording
Documentation change to support.md

diff:
Click the chat badge to join us on Discord for support!
-Also Check out our SubReddit [/r/DockSTARTer](https://www.reddit.com/r/DockSTARTer/)
+Also check out our subreddit, [/r/DockSTARTer](https://www.reddit.com/r/DockSTARTer/)
-[To Submit Feature Requests](https://github.com/GhostWriters/DockSTARTer/issues/new?template=feature_request.md)
+[Submit a Feature Request](https://github.com/GhostWriters/DockSTARTer/issues/new?template=feature_request.md)
-[To Submit Bug Reports](https://github.com/GhostWriters/DockSTARTer/issues/new?template=bug_report.md)
+[Submit a Bug Report](https://github.com/GhostWriters/DockSTARTer/issues/new?template=bug_report.md)
## External Information
-Below you will find links to various Tutorial Videos, Blogs , And Guides users have made.
+Below you will find links to various tutorial videos, blogs, and guides users have made.
* DBTech.com - [Raspberry Pi 4: Ultimate Home Server with DockerSTARTer Blog Post & Video Tutorial](https://dbte.ch/dockstarter)
* MakeUseOf.com - [How to Set Up a Linux Media Server in Under One Hour Tutorial](https://www.makeuseof.com/tag/setup-linux-media-server/)

original_message:
[minor] Fix strange capitalization and wording (#1062)

Documentation change to support.md


message:
Correct variable name for speedtest service
This is a bug fix. The container expects the variable to be OOKLA_EULA_GDPR. The service does not start as-is.

diff:
@@ -2,10 +2,10 @@ services:
speedtest:
container_name: speedtest
environment:
+ - OOKLA_EULA_GDPR=${SPEEDTEST_OOKLA_EULA_GDPR}
- PGID=${PGID}
- PUID=${PUID}
- SPEEDTEST_BASE_PATH=${SPEEDTEST_BASE_PATH}
- - SPEEDTEST_OOKLA_EULA_GDPR=${SPEEDTEST_OOKLA_EULA_GDPR}
- TZ=${TZ}
logging:
driver: json-file

original_message:
Correct variable name for speedtest service (#1064)

This is a bug fix. The container expects the variable to be OOKLA_EULA_GDPR. The service does not start as-is.


message: WIP: Don't fail on Arch linux

diff:
@@ -10,6 +10,9 @@ package_manager_run() {
run_script "pm_dnf_${ACTION}"
elif [[ -n "$(command -v yum)" ]]; then
run_script "pm_yum_${ACTION}"
+ elif [[ -n "$(command -v pacman)" ]]; then
+ warn "Arch Linux based distributions are not officially supported."
+ warn "You will need to install docker and docker-compose manually."
else
fatal "Package manager not detected!"
fi

original_message: WIP: Don't fail on Arch linux


message: Implement Pacman Scripts and Update Readme

diff:
@@ -11,10 +11,10 @@ package_manager_run() {
elif [[ -n "$(command -v yum)" ]]; then
run_script "pm_yum_${ACTION}"
elif [[ -n "$(command -v pacman)" ]]; then
- warn "Arch Linux based distributions are not officially supported."
- warn "You will need to install docker and docker-compose manually."
+ info "Docker packages for Arch Linux based distributions are not installed automatically."
+ run_script "pm_pacman_${ACTION}"
else
- fatal "Package manager not detected!"
+ fatal "Supported package manager not detected!"
fi
}

diff:
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+
+pm_pacman_clean() {
+ info "Cleaning up package cache."
+ pacman -Sc --noconfirm > /dev/null 2>&1 || info "Failed to cleanup pacman cache."
+}
+
+test_pm_pacman_clean() {
+ # run_script 'pm_pacman_clean'
+ warn "CI does not test pm_pacman_clean."
+}

diff:
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+
+pm_pacman_install() {
+ info "Installing dependencies."
+ pacman -Sy --noconfirm curl git grep libnewt sed > /dev/null 2>&1 || fatal "Failed to install dependencies using pacman."
+}
+
+test_pm_pacman_install() {
+ # run_script 'pm_pacman_install'
+ warn "CI does not test pm_pacman_install."
+}

diff:
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+
+pm_pacman_remove_docker() {
+ info "This script does not install or remove docker with pacman. You will need to do this manually."
+}
+
+test_pm_pacman_remove_docker() {
+ # run_script 'pm_pacman_remove_docker'
+ warn "CI does not test pm_pacman_remove_docker."
+}

diff:
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+
+pm_pacman_repos() {
+ return # All packages needed are in the Arch repos
+}
+
+test_pm_pacman_repos() {
+ # run_script 'pm_pacman_repos'
+ warn "CI does not test pm_pacman_repos."
+}

diff:
+#!/usr/bin/env bash
+set -euo pipefail
+IFS=$'\n\t'
+
+pm_pacman_upgrade() {
+ if [[ ${CI:-} != true ]]; then
+ notice "Upgrading packages. Please be patient, this can take a while."
+ local REDIRECT="> /dev/null 2>&1"
+ if [[ -n ${VERBOSE:-} ]] || run_script 'question_prompt' "${PROMPT:-CLI}" N "Would you like to display the command output?"; then
+ REDIRECT=""
+ fi
+ eval pacman -Syu --noconfirm "${REDIRECT}" || fatal "Failed to upgrade packages from pacman."
+ fi
+}
+
+test_pm_pacman_upgrade() {
+ # run_script 'pm_pacman_upgrade'
+ warn "CI does not test pm_pacman_upgrade."
+}

diff:
@@ -65,6 +65,16 @@ bash -c "$(curl -fsSL https://get.dockstarter.com)"
sudo reboot
```
+- Pacman Systems (Arch, Manjaro, EndeavourOS, etc)
+
+> Note that systems with the `pacman` package manager will not install `docker` via the [https://get.docker.com](https://get.docker.com) script that is used for other distros. The instructions below provide information on installing all required packages manually prior to installing DockSTARTer.
+
+```bash
+sudo pacman -Sy curl docker docker-compose git
+bash -c "$(curl -fsSL https://get.dockstarter.com)"
+sudo reboot
+```
+
<details>
<summary>Alternate install (any system)</summary>


message: Remove instruction to install docker-compose

diff:
@@ -70,7 +70,7 @@ sudo reboot
> Note that systems with the `pacman` package manager will not install `docker` via the [https://get.docker.com](https://get.docker.com) script that is used for other distros. The instructions below provide information on installing all required packages manually prior to installing DockSTARTer.
```bash
-sudo pacman -Sy curl docker docker-compose git
+sudo pacman -Sy curl docker git
bash -c "$(curl -fsSL https://get.dockstarter.com)"
sudo reboot
```


message: Add pacman command to alternative install

diff:
@@ -85,6 +85,7 @@ The standard install above downloads the initial script using a method with some
sudo apt-get install curl git
sudo dnf install curl git
sudo yum install curl git
+sudo pacman -Sy curl docker git
## NOTE: Do not sudo the next line.
git clone https://github.com/GhostWriters/DockSTARTer "/home/${USER}/.docker"


message: Make sure that /config/qBittorrent/downloads/ is mapped to the downloads directory

diff:
@@ -26,6 +26,7 @@ services:
- /etc/localtime:/etc/localtime:ro
- ${DOCKERCONFDIR}/qbittorrentvpn:/config
- ${DOCKERSHAREDDIR}:/shared
+ - ${DOWNLOADSDIR}:/config/qBittorrent/downloads
- ${DOWNLOADSDIR}:/data
- ${DOWNLOADSDIR}:/downloads
- ${VPN_OVPNDIR}:/config/openvpn


message: Create /etc/bash_completion.d/ if it does not exist

diff:
@@ -10,6 +10,10 @@ install_machine_completion() {
warn "Failed to check latest available docker machine completion version. This can be ignored for now."
return
fi
+ if [ ! -d "/etc/bash_completion.d/" ]; then
+ echo "/etc/bash_completion.d/ does not exist; attempting to create it."
+ mkdir -p /etc/bash_completion.d/
+ fi
info "Installing docker machine completion."
curl -fsL "https://raw.githubusercontent.com/docker/machine/${AVAILABLE_MACHINE_COMPLETION}/contrib/completion/bash/docker-machine.bash" -o /etc/bash_completion.d/docker-machine > /dev/null 2>&1 || fatal "Failed to install docker machine completion."
}


message: Add RustDesk App

diff:
+services:
+ rustdesk:
+ image: rustdesk/rustdesk-server

diff:
+services:
+ rustdesk:
+ hostname: ${DOCKERHOSTNAME}

diff:
+services:
+ rustdesk:
+ labels:
+ com.dockstarter.appinfo.deprecated: "false"
+ com.dockstarter.appinfo.description: An open-source self-hosted TeamViewer alternative
+ com.dockstarter.appinfo.nicename: RustDesk
+ com.dockstarter.appvars.rustdesk_enabled: "false"
+ com.dockstarter.appvars.rustdesk_network_mode: ""
+ com.dockstarter.appvars.rustdesk_port_21115: "21115"
+ com.dockstarter.appvars.rustdesk_port_21116: "21116"
+ com.dockstarter.appvars.rustdesk_port_21117: "21117"
+ com.dockstarter.appvars.rustdesk_port_21118: "21118"
+ com.dockstarter.appvars.rustdesk_port_21119: "21119"
+ com.dockstarter.appvars.rustdesk_restart: unless-stopped

diff:
+services:
+ rustdesk:
+ network_mode: ${RUSTDESK_NETWORK_MODE}

diff:
+services:
+ rustdesk:
+ container_name: rustdesk
+ environment:
+ - PGID=${PGID}
+ - PUID=${PUID}
+ - TZ=${TZ}
+ logging:
+ driver: json-file
+ options:
+ max-file: ${DOCKERLOGGING_MAXFILE}
+ max-size: ${DOCKERLOGGING_MAXSIZE}
+ restart: ${RUSTDESK_RESTART}
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - ${DOCKERCONFDIR}/rustdesk:/config
+ - ${DOCKERSTORAGEDIR}:/storage

diff:
+# RustDesk
+
+[![Docker Pulls](https://img.shields.io/docker/pulls/rustdesk/rustdesk-server?style=flat-square&color=607D8B&label=docker%20pulls&logo=docker)](https://hub.docker.com/r/rustdesk/rustdesk-server)
+[![GitHub Stars](https://img.shields.io/github/stars/rustdesk/rustdesk?style=flat-square&color=607D8B&label=github%20stars&logo=github)](https://github.com/rustdesk/rustdesk)
+[![Compose Templates](https://img.shields.io/static/v1?style=flat-square&color=607D8B&label=compose&message=templates)](https://github.com/GhostWriters/DockSTARTer/tree/master/compose/.apps/rustdesk)
+
+## Description
+
+[RustDesk](https://rustdesk.com) is an open-source, self-hosted TeamViewer alternative.
+
+## Install/Setup
+
+This application does not have any specific setup instructions documented. If
+you need assistance setting up this application please visit our
+[support page](https://dockstarter.com/basics/support/).

diff:
@@ -189,6 +189,7 @@ nav:
- apps/rsnapshot.md
- apps/rtorrentvpn.md
- apps/rutorrent.md
+ - apps/rustdesk.md
- apps/sabnzbd.md
- apps/sabnzbdvpn.md
- apps/samba.md

original_message: Add RustDesk App


message: Try to configure command value of containers to start correct services

diff:
@@ -15,3 +15,4 @@ services:
- /etc/localtime:/etc/localtime:ro
- ${DOCKERCONFDIR}/rustdesk_hbbr:/config
- ${DOCKERSTORAGEDIR}:/storage
+ command: hbbr

diff:
@@ -15,3 +15,4 @@ services:
- /etc/localtime:/etc/localtime:ro
- ${DOCKERCONFDIR}/rustdesk_hbbs:/config
- ${DOCKERSTORAGEDIR}:/storage
+ command: hbbs -r ${DOCKERHOSTNAME}:${RUSTDESK_HBBR_PORT_21117}
\ No newline at end of file


message: Drop unused ports for each app from labels

diff:
@@ -6,9 +6,6 @@ services:
com.dockstarter.appinfo.nicename: RustDesk hbbr
com.dockstarter.appvars.rustdesk_hbbr_enabled: "false"
com.dockstarter.appvars.rustdesk_hbbr_network_mode: ""
- com.dockstarter.appvars.rustdesk_hbbr_port_21115: "21115"
- com.dockstarter.appvars.rustdesk_hbbr_port_21116: "21116"
com.dockstarter.appvars.rustdesk_hbbr_port_21117: "21117"
- com.dockstarter.appvars.rustdesk_hbbr_port_21118: "21118"
com.dockstarter.appvars.rustdesk_hbbr_port_21119: "21119"
com.dockstarter.appvars.rustdesk_hbbr_restart: unless-stopped

diff:
@@ -8,7 +8,5 @@ services:
com.dockstarter.appvars.rustdesk_hbbs_network_mode: ""
com.dockstarter.appvars.rustdesk_hbbs_port_21115: "21115"
com.dockstarter.appvars.rustdesk_hbbs_port_21116: "21116"
- com.dockstarter.appvars.rustdesk_hbbs_port_21117: "21117"
com.dockstarter.appvars.rustdesk_hbbs_port_21118: "21118"
- com.dockstarter.appvars.rustdesk_hbbs_port_21119: "21119"
com.dockstarter.appvars.rustdesk_hbbs_restart: unless-stopped


message: Make descriptions better

diff:
@@ -2,7 +2,7 @@ services:
rustdesk_hbbr:
labels:
com.dockstarter.appinfo.deprecated: "false"
- com.dockstarter.appinfo.description: hbbr component for RustDesk, an open-source self-hosted TeamViewer alternative
+ com.dockstarter.appinfo.description: The relay server component for RustDesk, an open-source self-hosted TeamViewer alternative
com.dockstarter.appinfo.nicename: RustDesk hbbr
com.dockstarter.appvars.rustdesk_hbbr_enabled: "false"
com.dockstarter.appvars.rustdesk_hbbr_network_mode: ""

diff:
@@ -2,7 +2,7 @@ services:
rustdesk_hbbs:
labels:
com.dockstarter.appinfo.deprecated: "false"
- com.dockstarter.appinfo.description: hbbs component for RustDesk, an open-source self-hosted TeamViewer alternative
+ com.dockstarter.appinfo.description: The ID/rendezvous server for RustDesk, an open-source self-hosted TeamViewer alternative
com.dockstarter.appinfo.nicename: RustDesk hbbs
com.dockstarter.appvars.rustdesk_hbbs_enabled: "false"
com.dockstarter.appvars.rustdesk_hbbs_network_mode: ""

original_message: Make descriptions better


diff:
@@ -13,6 +13,5 @@ services:
restart: ${RUSTDESK_HBBR_RESTART}
volumes:
- /etc/localtime:/etc/localtime:ro
- - ${DOCKERCONFDIR}/rustdesk_hbbr:/config
- - ${DOCKERSTORAGEDIR}:/storage
+ - ${DOCKERCONFDIR}/rustdesk_hbbr:/root
command: hbbr

diff:
@@ -13,6 +13,5 @@ services:
restart: ${RUSTDESK_HBBS_RESTART}
volumes:
- /etc/localtime:/etc/localtime:ro
- - ${DOCKERCONFDIR}/rustdesk_hbbs:/config
- - ${DOCKERSTORAGEDIR}:/storage
+ - ${DOCKERCONFDIR}/rustdesk_hbbs:/root
command: hbbs -r ${DOCKERHOSTNAME}:${RUSTDESK_HBBR_PORT_21117}

original_message: In the vendor example, persistent data is in /root. https://rustdesk.com/docs/en/self-host/install/


message: Try to improve references to hbbr from hbbs app

diff:
@@ -4,6 +4,8 @@ services:
com.dockstarter.appinfo.deprecated: "false"
com.dockstarter.appinfo.description: The ID/rendezvous server for RustDesk, an open-source self-hosted TeamViewer alternative
com.dockstarter.appinfo.nicename: RustDesk hbbs
+ com.dockstarter.appvars.rustdesk_hbbr_port_21117: "21117"
+ com.dockstarter.appvars.rustdesk_hbbr_host: ${DOCKERHOSTNAME}
com.dockstarter.appvars.rustdesk_hbbs_enabled: "false"
com.dockstarter.appvars.rustdesk_hbbs_network_mode: ""
com.dockstarter.appvars.rustdesk_hbbs_port_21115: "21115"

diff:
@@ -14,4 +14,4 @@ services:
volumes:
- /etc/localtime:/etc/localtime:ro
- ${DOCKERCONFDIR}/rustdesk_hbbs:/root
- command: hbbs -r ${DOCKERHOSTNAME}:${RUSTDESK_HBBR_PORT_21117}
+ command: hbbs -r ${RUSTDESK_HBBR_HOST}:${RUSTDESK_HBBR_PORT_21117}


message: It seems to not like this space here

diff:
@@ -3,7 +3,7 @@ services:
labels:
com.dockstarter.appinfo.deprecated: "false"
com.dockstarter.appinfo.description: The relay server component for RustDesk, an open-source self-hosted TeamViewer alternative
- com.dockstarter.appinfo.nicename: RustDesk hbbr
+ com.dockstarter.appinfo.nicename: RustDesk_hbbr
com.dockstarter.appvars.rustdesk_hbbr_enabled: "false"
com.dockstarter.appvars.rustdesk_hbbr_network_mode: ""
com.dockstarter.appvars.rustdesk_hbbr_port_21117: "21117"

diff:
@@ -3,7 +3,7 @@ services:
labels:
com.dockstarter.appinfo.deprecated: "false"
com.dockstarter.appinfo.description: The ID/rendezvous server for RustDesk, an open-source self-hosted TeamViewer alternative
- com.dockstarter.appinfo.nicename: RustDesk hbbs
+ com.dockstarter.appinfo.nicename: RustDesk_hbbs
com.dockstarter.appvars.rustdesk_hbbr_port_21117: "21117"
com.dockstarter.appvars.rustdesk_hbbr_host: ${DOCKERHOSTNAME}
com.dockstarter.appvars.rustdesk_hbbs_enabled: "false"

original_message: It seems to not like this space here


message: Use localhost as default since that variable expansion failed

diff:
@@ -5,7 +5,7 @@ services:
com.dockstarter.appinfo.description: The ID/rendezvous server for RustDesk, an open-source self-hosted TeamViewer alternative
com.dockstarter.appinfo.nicename: RustDesk_hbbs
com.dockstarter.appvars.rustdesk_hbbr_port_21117: "21117"
- com.dockstarter.appvars.rustdesk_hbbr_host: ${DOCKERHOSTNAME}
+ com.dockstarter.appvars.rustdesk_hbbr_host: "localhost"
com.dockstarter.appvars.rustdesk_hbbs_enabled: "false"
com.dockstarter.appvars.rustdesk_hbbs_network_mode: ""
com.dockstarter.appvars.rustdesk_hbbs_port_21115: "21115"


message: Update rustdesk_hbbs.md

diff:
hbbs is the RustDesk ID/Rendezvous server. You will need both hbbs and hbbr for a functional deployment.
+When hbbs is first run, it will generate a public/private keypair for the clients to use. You can see this take place in the logs:
+
+```
+INFO [src/common.rs:133] Private/public key written to id_ed25519/id_ed25519.pub
+```
+
+You can view the contents of this key by browsing to your config folder, for instance, `~/.config/appdata/rustdesk_hbbs`.
+
## Install/Setup
This application does not have any specific setup instructions documented. If

original_message: Update rustdesk_hbbs.md


message: Delete duplicate port 21117

diff:
@@ -4,7 +4,6 @@ services:
com.dockstarter.appinfo.deprecated: "false"
com.dockstarter.appinfo.description: The ID/rendezvous server for RustDesk, an open-source self-hosted TeamViewer alternative
com.dockstarter.appinfo.nicename: RustDesk
- com.dockstarter.appvars.rustdesk_port_21117: "21117"
com.dockstarter.appvars.rustdesk_enabled: "false"
com.dockstarter.appvars.rustdesk_network_mode: ""
com.dockstarter.appvars.rustdesk_port_21115: "21115"

original_message: Delete duplicate port 21117


diff:
@@ -2,7 +2,7 @@ services:
rustdesk:
labels:
com.dockstarter.appinfo.deprecated: "false"
- com.dockstarter.appinfo.description: The ID/rendezvous server for RustDesk, an open-source self-hosted TeamViewer alternative
+com.dockstarter.appinfo.description: RustDesk server software including hbbs (rendezvous server) and hbbr (relay server) program, an open-source self-hosted TeamViewer alternative
com.dockstarter.appinfo.nicename: RustDesk
com.dockstarter.appvars.rustdesk_enabled: "false"
com.dockstarter.appvars.rustdesk_network_mode: ""

original_message:
Update the application description for RustDesk

Co-authored-by: shahvirb <shahvirb+github@gmail.com>


message: Sort variables alphabetically

diff:
@@ -4,8 +4,8 @@ services:
environment:
- PGID=${PGID}
- PUID=${PUID}
- - TZ=${TZ}
- RELAY=${RUSTDESK_RELAY_SERVER}
+ - TZ=${TZ}
logging:
driver: json-file
options:

original_message:
Sort variables alphabetically

Co-authored-by: Eric Nemchik <eric@nemchik.com>


message: Remove the latest tag from all of the Docker images

diff:
services:
rustdesk:
- image: rustdesk/rustdesk-server-s6:latest
+ image: rustdesk/rustdesk-server-s6


message: Add openspeedtest app

diff:
+services:
+ openspeedtest:
+ image: openspeedtest/latest
\ No newline at end of file

diff:
+services:
+ openspeedtest:
+ hostname: ${DOCKERHOSTNAME}

diff:
+services:
+ openspeedtest:
+ labels:
+ com.dockstarter.appinfo.deprecated: "false"
+ com.dockstarter.appinfo.description: This is a self-hosted speedtest service
+ com.dockstarter.appinfo.nicename: openspeedtest
+ com.dockstarter.appvars.openspeedtest_base_path: /
+ com.dockstarter.appvars.openspeedtest_enabled: "false"
+ com.dockstarter.appvars.openspeedtest_network_mode: ""
+ com.dockstarter.appvars.openspeedtest_ookla_eula_gdpr: "true"
+ com.dockstarter.appvars.openspeedtest_port_3000: "3000"
+ com.dockstarter.appvars.openspeedtest_port_3001: "3001"
+ com.dockstarter.appvars.openspeedtest_restart: unless-stopped

diff:
+services:
+ openspeedtest:
+ network_mode: ${OPENSPEEDTEST_NETWORK_MODE}

diff:
+services:
+ openspeedtest:
+ ports:
+ - ${OPENSPEEDTEST_PORT_3000}:3000
+ - ${OPENSPEEDTEST_PORT_3001}:3001
\ No newline at end of file

diff:
+services:
+ openspeedtest:
+ container_name: openspeedtest
+ environment:
+ - PGID=${PGID}
+ - PUID=${PUID}
+ - BASE_PATH=${OPENSPEEDTEST_BASE_PATH}
+ - TZ=${TZ}
+ logging:
+ driver: json-file
+ options:
+ max-file: ${DOCKERLOGGING_MAXFILE}
+ max-size: ${DOCKERLOGGING_MAXSIZE}
+ restart: ${OPENSPEEDTEST_RESTART}
+ volumes:
+ - /etc/localtime:/etc/localtime:ro
+ - ${DOCKERCONFDIR}/openspeedtest:/config
+ - ${DOCKERSTORAGEDIR}:/storage

original_message: Add openspeedtest app


message: Add documentation page and link

diff:
+# Speedtest
+
+[![Docker Pulls](https://img.shields.io/docker/pulls/openspeedtest/latest?style=flat-square&color=607D8B&label=docker%20pulls&logo=docker)](https://hub.docker.com/r/openspeedtest/latest)
+[![GitHub Stars](https://img.shields.io/github/stars/openspeedtest/latest?style=flat-square&color=607D8B&label=github%20stars&logo=github)](https://github.com/openspeedtest/latest)
+[![Compose Templates](https://img.shields.io/static/v1?style=flat-square&color=607D8B&label=compose&message=templates)](https://github.com/GhostWriters/DockSTARTer/tree/master/compose/.apps/speedtest)
+
+## Description
+
+[OpenSpeedTest](https://github.com/openspeedtest/Speed-Test) is a self-hosted speed test service which is useful for testing the connection speed to your server.
\ No newline at end of file

diff:
@@ -164,6 +164,7 @@ nav:
- apps/omadacontroller.md
- apps/ombi.md
- apps/openldap.md
+ - apps/openspeedtest.md
- apps/openvpnas.md
- apps/organizr.md
- apps/ouroboros.md

original_message: Add documentation page and link


message: Set nice name to OpenSpeedTest

diff:
@@ -3,7 +3,7 @@ services:
labels:
com.dockstarter.appinfo.deprecated: "false"
com.dockstarter.appinfo.description: This is a self-hosted speedtest service
- com.dockstarter.appinfo.nicename: openspeedtest
+ com.dockstarter.appinfo.nicename: OpenSpeedTest
com.dockstarter.appvars.openspeedtest_base_path: /
com.dockstarter.appvars.openspeedtest_enabled: "false"
com.dockstarter.appvars.openspeedtest_network_mode: ""

original_message: Set nice name to OpenSpeedTest


message:
Issue
CMake install fails with error when release isn't built before debug.
Problem
CMakeLists file had hardcoded paths to libflatbuffers.a
Resolution
Updated the paths to use CMake environment variables so the files
get picked up regardless of the change in output folder.

diff:
@@ -386,8 +386,8 @@ install(
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/surelog/ErrorReporting)
install(
FILES ${PROJECT_SOURCE_DIR}/dist/libantlr4-runtime.a
- ${PROJECT_SOURCE_DIR}/build/third_party/flatbuffers/libflatbuffers.a
- ${PROJECT_SOURCE_DIR}/build/third_party/UHDM/libuhdm.a
+ ${CMAKE_BINARY_DIR}/third_party/flatbuffers/libflatbuffers.a
+ ${CMAKE_BINARY_DIR}/third_party/UHDM/libuhdm.a
DESTINATION ${CMAKE_INSTALL_LIBDIR}/surelog)
install(
FILES ${PROJECT_SOURCE_DIR}/src/API/PythonAPI.h

license: Apache License 2.0

repo: chipsalliance/surelog

original_message:
Issue #354
CMake install fails with error when release isn't built before debug.

Problem
CMakeLists file had hardcoded paths to libflatbuffers.a

Resolution
Updated the paths to use CMake environment variables so the files
get picked up regardless of the change in output folder.


message:
Issue#239
Add support for Windows
Highlights -
Renaming slapi.* files to slapi_scripts.* to support non-case
sensitive platforms like windows. The folder already contains
another file with the same name and that won't scale to these
platforms. Files renamed and related scripts updated.

diff:
@@ -145,7 +145,7 @@ add_custom_command(
COMMAND SourceCompile/generate_parser_listener.tcl ;
COMMAND API/generate_python_listener_api.tcl ;
COMMAND echo " Python API Generation..."
- COMMAND ${SWIG_EXECUTABLE} -c++ -python -o API/slapi_wrap.cxx API/slapi.i ;
+ COMMAND ${SWIG_EXECUTABLE} -c++ -python -o API/slapi_wrap.cxx API/slapi_scripts.i ;
COMMAND API/embed_python_api.tcl
COMMAND touch ${PROJECT_SOURCE_DIR}/src/SourceCompile/dummy2
COMMAND echo " Code Generation completed"
@@ -155,7 +155,7 @@ add_custom_command(
${PROJECT_SOURCE_DIR}/grammar/SV3_1aPpParser.g4
${PROJECT_SOURCE_DIR}/grammar/SV3_1aParser.g4
${PROJECT_SOURCE_DIR}/grammar/SV3_1aSplitterParser.g4
- ${PROJECT_SOURCE_DIR}/src/API/slapi.i
+ ${PROJECT_SOURCE_DIR}/src/API/slapi_scripts.i
${PROJECT_SOURCE_DIR}/src/parser/dummy1)
include_directories(${PROJECT_SOURCE_DIR}/src)

diff:
@@ -58,7 +58,7 @@ using namespace SURELOG;
#include "ParserRuleContext.h"
#include "API/slapi_wrap.cxx"
-#include "API/slapi.h"
+#include "API/slapi_scripts.h"
#include "API/vobjecttypes_py.h"
#include <cstdlib>
#include "SourceCompile/PythonListen.h"

diff:
@@ -25,7 +25,7 @@ set content "$content\n[read $fid]"
close $fid
set lines [split $content "\n"]
-set oid [open "API/slapi.h" "w"]
+set oid [open "API/slapi_scripts.h" "w"]
puts $oid "std::vector<std::string> slapi_scripts = {"

change_type: RENAME


message:
Pull back cmake and C++ upgrade for now. Will reintroduce it in a
later change.

diff:
# -*- mode:cmake -*-
-cmake_minimum_required(VERSION 3.15)
+cmake_minimum_required(VERSION 3.5.1)
# Detect build type, fallback to release and throw a warning if use didn't
# specify any
@@ -30,7 +30,7 @@ add_subdirectory(third_party/antlr4/runtime/Cpp EXCLUDE_FROM_ALL)
add_subdirectory(third_party/UHDM)
add_subdirectory(third_party/googletest EXCLUDE_FROM_ALL)
-set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)


message:
Issue (Part 2)
Add Windows platform support
Highlights -
Add colon (:) as a legal character when parsing filepaths.
Also, fixed a few indenting issues.

diff:
# Optional parameter to provide an output directory
set DEST_DIR "."
-if [regexp {out_dir=([a-zA-Z0-9_/\.-]+)} $argv tmp DEST_DIR] {}
+if [regexp {out_dir=([a-zA-Z0-9_/\.-:]+)} $argv tmp DEST_DIR] {}
set LISTENERS "Parser PreProc"

original_message:
Issue #239 (Part 2)
Add Windows platform support

Highlights -
Add colon (:) as a legal character when parsing filepaths.
Also, fixed a few indenting issues.


message:
Issue (Part 3)
Add Windows platform support
Highlights -
* Swapping Posix functions for std functions
* Fixing a few include file related issues to get code
compiling on Windows.

diff:
-/* File: slapi.i */
+/* File: slapi_scripts.i */
%module slapi
%include "typemaps.i"
%include "std_string.i"

diff:
#include <limits.h>
#include <sstream>
-#include <stdlib.h>
+#include <cstdlib>
#include <string.h>
#include <sys/param.h>
#include <sys/stat.h>
@@ -395,6 +395,9 @@ void CommandLineParser::processArgs_(std::vector<std::string>& args,
// Try to find the full absolute path of the program currently running.
static std::string GetProgramNameAbsolutePath(const char *progname) {
+#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__)
+ const char PATH_DELIMITER = ';';
+#else
char buf[PATH_MAX];
// If the executable is invoked with a path, we can extract it from there,
// otherwise, we use some operating system trick to find that path:
@@ -405,16 +408,20 @@ static std::string GetProgramNameAbsolutePath(const char *progname) {
const char *const program_name = realpath(testpath, buf);
if (program_name) return program_name;
}
+ const char PATH_DELIMITER = ':';
+#endif
// Still not found, let's go through the $PATH and see what comes up first.
- const char *const path = getenv("PATH");
+ const char *const path = std::getenv("PATH");
if (path) {
std::stringstream search_path(path);
std::string path_element;
- while (std::getline(search_path, path_element, ':')) {
+ std::string program_path;
+ while (std::getline(search_path, path_element, PATH_DELIMITER)) {
const std::string testpath = path_element + "/" + progname;
- const char *const program_name = realpath(testpath.c_str(), buf);
- if (program_name) return program_name;
+ if (FileUtils::getFullPath(testpath, &program_path)) {
+ return program_path;
+ }
}
}

diff:
#include "tbb/task_scheduler_init.h"
#endif
+#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
+ #include <process.h> // Has to be included before <thread>
+#endif
+
#include <vector>
#include <thread>

diff:
@@ -44,7 +44,9 @@ ErrorContainer::ErrorContainer(SymbolTable* symbolTable)
/* Do nothing here */
}
+#if !(defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
#include <unistd.h>
+#endif
#include <stdio.h>
void ErrorContainer::init() {

diff:
#include "ErrorReporting/Report.h"
#include <iostream>
#include <fstream>
-#include <unistd.h>
#include <iomanip>
#include <regex>
#include <mutex>
+#include <chrono>
+#include <thread>
+
+#if !(defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
+ #include <unistd.h>
+#endif
+
using namespace SURELOG;
Report::Report() {}
@@ -99,7 +105,7 @@ std::pair<bool, bool> Report::makeDiffCompUnitReport(CommandLineParser* clp,
Result readUnitResult;
while ((!readAll) || (!readUnit)) {
- usleep(1000);
+ std::this_thread::sleep_for(std::chrono::microseconds(1000));
if (!readAll) {
readAll = parseReportFile(alllog, readAllResult);
}

diff:
@@ -44,6 +44,11 @@ using namespace antlr4;
#include "API/PythonAPI.h"
#include "SourceCompile/CheckCompile.h"
+
+#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
+ #include <process.h> // Has to be included before <thread>
+#endif
+
#include <mutex>
#include <thread>
#include <vector>

diff:
#include "Utils/FileUtils.h"
#include "Utils/StringUtils.h"
#include <sys/stat.h>
-#include <unistd.h>
#include <string.h>
#include <limits.h> /* PATH_MAX */
#include <errno.h>
#include <iostream>
#include <algorithm>
#include <string>
-#include <dirent.h>
#include <stdio.h>
#include <regex>
#include <fstream>
#include <sstream>
+#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
+ #include <direct.h>
+ #define PATH_MAX _MAX_PATH
+ // Supress the warning for the time being until we upgrade to C++17
+ #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
+#else
+ #include <dirent.h>
+ #include <unistd.h>
+#endif
+
+#if (__cplusplus >= 201703L) && __has_include(<filesystem>)
+ #include <filesystem>
+ namespace fs = std::filesystem;
+#else
+ #include <experimental/filesystem>
+ namespace fs = std::experimental::filesystem;
+#endif
+
using namespace SURELOG;
FileUtils::FileUtils() {}
@@ -60,15 +76,11 @@ unsigned long FileUtils::fileSize(const std::string name) {
}
bool FileUtils::fileIsDirectory(const std::string name) {
- struct stat statbuf;
- if (stat(name.c_str(), &statbuf) != 0) return 0;
- return S_ISDIR(statbuf.st_mode);
+ return fs::is_directory(name);
}
bool FileUtils::fileIsRegular(const std::string name) {
- struct stat statbuf;
- if (stat(name.c_str(), &statbuf) != 0) return 0;
- return S_ISREG(statbuf.st_mode);
+ return fs::is_regular_file(name);
}
SymbolId FileUtils::locateFile(SymbolId file, SymbolTable* symbols,
@@ -92,64 +104,32 @@ SymbolId FileUtils::locateFile(SymbolId file, SymbolTable* symbols,
}
int FileUtils::mkDir(const char* path) {
- /* Adapted from http://stackoverflow.com/a/2336245/119527 */
- const size_t len = strlen(path);
- char _path[PATH_MAX];
- char* p;
-
- errno = 0;
-
- /* Copy string so its mutable */
- if (len > sizeof(_path) - 1) {
- errno = ENAMETOOLONG;
- return -1;
- }
- strcpy(_path, path);
-
- /* Iterate the string */
- for (p = _path + 1; *p; p++) {
- if (*p == '/') {
- /* Temporarily truncate */
- *p = '\0';
- if (mkdir(_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {
- if (errno != EEXIST) return -1;
- }
-
- *p = '/';
- }
- }
-
- if (mkdir(_path, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {
- if (errno != EEXIST) return -1;
- }
-
- return 0;
+ // CAUTION: There is a known bug in VC compiler where a trailing
+ // slash in the path will cause a false return from a call to
+ // fs::create_directories.
+ const std::string dirpath(path);
+ fs::create_directories(dirpath);
+ return fs::is_directory(dirpath) ? 0 : -1;
}
std::string FileUtils::getPathName(const std::string path) {
- char sep = '/';
-
-#ifdef _WIN32
- sep = '\\';
-#endif
-
- size_t i = path.rfind(sep, path.length());
- if (i != std::string::npos) {
- return (path.substr(0, i)) + "/";
+ return (fs::path(path).parent_path() += fs::path::preferred_separator).string();
}
- return ("");
+std::string FileUtils::getFullPath(const std::string path) {
+ std::error_code ec;
+ fs::path fullPath = fs::canonical(path, ec);
+ return ec ? path : fullPath.string();
}
-std::string FileUtils::getFullPath(const std::string path) {
- char* full_path = realpath(path.c_str(), NULL);
- std::string ret;
- if (full_path) {
- ret = full_path;
- free(full_path);
- } else
- ret = path;
- return ret;
+bool FileUtils::getFullPath(const std::string path, std::string* const result) {
+ std::error_code ec;
+ fs::path fullPath = fs::canonical(path, ec);
+ if (!ec && fileIsRegular(fullPath.string())) {
+ if (result != nullptr) *result = fullPath.string();
+ return true;
+ }
+ return false;
}
static bool has_suffix(const std::string& s, const std::string& suffix) {
@@ -166,26 +146,15 @@ std::vector<SymbolId> FileUtils::collectFiles(SymbolId dirPath, SymbolId ext,
std::vector<SymbolId> FileUtils::collectFiles(const std::string dirPath,
const std::string ext,
SymbolTable* symbols) {
- std::string path = dirPath;
- if (path.size()) {
- if (path[path.size() - 1] != '/') {
- path += "/";
- }
- }
std::vector<SymbolId> result;
- DIR* dir = opendir(path.c_str());
- if (!dir) {
- return result;
+ if (fileIsDirectory(dirPath)) {
+ for (fs::directory_entry entry : fs::directory_iterator(dirPath)) {
+ const std::string filepath = entry.path().string();
+ if (has_suffix(filepath, ext)) {
+ result.push_back(symbols->registerSymbol(filepath));
}
-
- dirent* entry;
- while ((entry = readdir(dir)) != NULL) {
- if (has_suffix(entry->d_name, ext)) {
- result.push_back(symbols->registerSymbol(path + entry->d_name));
}
}
-
- closedir(dir);
return result;
}
@@ -193,8 +162,7 @@ std::vector<SymbolId> FileUtils::collectFilesRegexp(const std::string dirPath,
const std::string regexp,
SymbolTable* symbols) {
std::vector<SymbolId> result;
- DIR* dir = opendir(dirPath.c_str());
- if (!dir) {
+ if (!fileIsDirectory(dirPath)) {
return result;
}
@@ -217,15 +185,13 @@ std::vector<SymbolId> FileUtils::collectFilesRegexp(const std::string dirPath,
std::regex base_regex(newregexp);
std::smatch base_match;
- dirent* entry;
- while ((entry = readdir(dir)) != NULL) {
- std::string value = entry->d_name;
+ for (fs::directory_entry entry : fs::directory_iterator(dirPath)) {
+ std::string value = entry.path().string();
if (std::regex_match(value, base_match, base_regex)) {
- result.push_back(symbols->registerSymbol(entry->d_name));
+ result.push_back(symbols->registerSymbol(value));
}
}
- closedir(dir);
return result;
}
@@ -322,3 +288,4 @@ std::string FileUtils::fileName(std::string str) {
str.erase(str.begin(), it1.base());
return str;
}
+

diff:
#ifndef FILEUTILS_H
#define FILEUTILS_H
+
+#include <string>
#include <vector>
namespace SURELOG {
+typedef uint64_t SymbolId;
+class SymbolTable;
+
class FileUtils {
public:
static bool fileExists(const std::string name);
@@ -36,6 +41,7 @@ class FileUtils {
const std::vector<SymbolId>& paths);
static int mkDir(const char* path);
static std::string getFullPath(const std::string path);
+ static bool getFullPath(const std::string path, std::string *const result);
static std::string getPathName(const std::string path);
static std::string fileName(std::string str);
static unsigned long fileSize(const std::string name);

diff:
@@ -205,6 +205,14 @@ int main(int argc, const char ** argv) {
switch (mode) {
case DIFF:
{
+ #if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
+ // REVISIT: Windows doesn't have the concept of forks!
+ // Implement it sequentially for now and optimize it if this
+ // proves to be a bottleneck (preferably, implemented as a
+ // cross platform solution).
+ executeCompilation(argc, argv, true, false);
+ codedReturn = executeCompilation(argc, argv, true, true);
+ #else
pid_t pid = fork();
if (pid == 0) {
// child process
@@ -217,7 +225,7 @@ int main(int argc, const char ** argv) {
printf("fork() failed!\n");
return 1;
}
- break;
+ #endif
}
case NORMAL:
codedReturn = executeCompilation(argc, argv, false, false);

original_message:
Issue #239 (Part 3)
Add Windows platform support

Highlights -
* Swapping Posix functions for std functions
* Fixing a few include file related issues to get code
  compiling on Windows.


message: Fix TestInstall/CMakeLists.txt

diff:
project(HELLOSUREWORLD)
-set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD 14)
-cmake_minimum_required(VERSION 3.0)
+cmake_minimum_required(VERSION 3.13)
# Python
-find_package(PythonLibs 3.3 REQUIRED)
-INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS})
-message(STATUS "PYTHON_LIBRARIES = ${PYTHON_LIBRARIES}")
-message(STATUS "PYTHON_EXECUTABLE = ${PYTHON_EXECUTABLE}")
-message(STATUS "PYTHON_INCLUDE_DIRS = ${PYTHON_INCLUDE_DIRS}")
+find_package(Python3 3.3 REQUIRED COMPONENTS Interpreter Development)
+include_directories(${Python3_INCLUDE_DIRS})
+message(STATUS "Python3_LIBRARIES = ${Python3_LIBRARIES}")
+message(STATUS "Python3_EXECUTABLE = ${Python3_EXECUTABLE}")
+message(STATUS "Python3_INCLUDE_DIRS = ${Python3_INCLUDE_DIRS}")
+message(STATUS "Python3_RUNTIME_LIBRARY_DIRS = ${Python3_RUNTIME_LIBRARY_DIRS}")
# Directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/)
@@ -43,23 +44,22 @@ include_directories(${INCLUDE_DIR})
include_directories("${INSTALL_DIR}/include/uhdm/")
include_directories("${INSTALL_DIR}/include/uhdm/include/")
-set (LIB_DIR "${INSTALL_DIR}/lib/surelog/")
+set (LIB_DIR "${INSTALL_DIR}/lib/")
if(NOT NO_TCMALLOC)
set (TCMALLOC_LIBRARY tcmalloc)
endif(NOT NO_TCMALLOC)
set (INSTALL_LIBRARIES_FOR_SURELOG
- -L${LIB_DIR} surelog
+ -L${LIB_DIR}surelog/ surelog
antlr4-runtime
flatbuffers
uhdm
- -L${LIB_DIR}/../uhdm
+ -L${LIB_DIR}uhdm/
capnp kj
- ${PYTHON_LIBRARIES} dl util m rt pthread ${TCMALLOC_LIBRARY}
+ ${Python3_LIBRARIES} dl util m rt pthread ${TCMALLOC_LIBRARY}
)
add_executable(test_hellosureworld ${PROJECT_SOURCE_DIR}/../../src/hellosureworld.cpp)
-target_link_libraries(
- test_hellosureworld ${INSTALL_LIBRARIES_FOR_SURELOG}
-)
+target_link_libraries(test_hellosureworld ${INSTALL_LIBRARIES_FOR_SURELOG})
+target_link_libraries(test_hellosureworld stdc++fs)

original_message: Fix TestInstall/CMakeLists.txt