2016-10-18 11:05:48 +00:00
#!/usr/bin/env bash
# Pi-hole: A black hole for Internet advertisements
2017-02-22 17:55:20 +00:00
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
#
2016-11-01 18:33:04 +00:00
# Check Pi-hole core and admin pages versions and determine what
# upgrade (if any) is required. Automatically updates and reinstalls
# application if update is detected.
2016-10-18 11:05:48 +00:00
#
2017-02-22 17:55:20 +00:00
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
2016-10-18 11:11:02 +00:00
# Variables
2023-10-08 13:09:47 +00:00
readonly ADMIN_INTERFACE_GIT_URL = "https://github.com/pi-hole/web.git"
2016-11-02 05:19:40 +00:00
readonly ADMIN_INTERFACE_DIR = "/var/www/html/admin"
readonly PI_HOLE_GIT_URL = "https://github.com/pi-hole/pi-hole.git"
readonly PI_HOLE_FILES_DIR = "/etc/.pihole"
2017-02-05 19:07:04 +00:00
2017-06-25 21:21:41 +00:00
# shellcheck disable=SC2034
2022-07-06 20:58:14 +00:00
SKIP_INSTALL = true
2016-10-18 13:19:25 +00:00
2018-04-15 17:25:35 +00:00
# when --check-only is passed to this script, it will not perform the actual update
CHECK_ONLY = false
2017-07-26 17:00:08 +00:00
# shellcheck disable=SC1090
2017-06-25 21:21:41 +00:00
source " ${ PI_HOLE_FILES_DIR } /automated install/basic-install.sh "
2017-07-26 17:00:08 +00:00
# shellcheck disable=SC1091
2017-06-25 21:21:41 +00:00
source "/opt/pihole/COL_TABLE"
2017-06-21 11:49:05 +00:00
2017-01-29 01:32:42 +00:00
# is_repo() sourced from basic-install.sh
# make_repo() sourced from basic-install.sh
# update_repo() source from basic-install.sh
# getGitFiles() sourced from basic-install.sh
2018-04-02 21:06:36 +00:00
# FTLcheckUpdate() sourced from basic-install.sh
2016-11-02 05:19:40 +00:00
2016-12-24 14:19:39 +00:00
GitCheckUpdateAvail( ) {
2018-07-20 20:22:37 +00:00
local directory
2021-12-22 18:21:44 +00:00
local curBranch
2018-07-20 20:22:37 +00:00
directory = " ${ 1 } "
curdir = $PWD
2024-10-20 07:34:15 +00:00
cd " ${ directory } " || exit 1
2018-07-20 20:22:37 +00:00
# Fetch latest changes in this repo
2024-10-20 07:34:15 +00:00
if ! git fetch --quiet origin ; then
echo -e " \\n ${ COL_LIGHT_RED } Error: Unable to update local repository. Contact Pi-hole Support. ${ COL_NC } "
exit 1
fi
2018-07-20 20:22:37 +00:00
2021-12-22 18:21:44 +00:00
# Check current branch. If it is master, then check for the latest available tag instead of latest commit.
curBranch = $( git rev-parse --abbrev-ref HEAD)
if [ [ " ${ curBranch } " = = "master" ] ] ; then
# get the latest local tag
LOCAL = $( git describe --abbrev= 0 --tags master)
# get the latest tag from remote
REMOTE = $( git describe --abbrev= 0 --tags origin/master)
else
# @ alone is a shortcut for HEAD. Older versions of git
# need @{0}
LOCAL = " $( git rev-parse "@{0}" ) "
# The suffix @{upstream} to a branchname
# (short form <branchname>@{u}) refers
# to the branch that the branch specified
# by branchname is set to build on top of#
# (configured with branch.<name>.remote and
# branch.<name>.merge). A missing branchname
# defaults to the current one.
REMOTE = " $( git rev-parse "@{upstream}" ) "
fi
2018-07-20 20:22:37 +00:00
if [ [ " ${# LOCAL } " = = 0 ] ] ; then
echo -e " \\n ${ COL_LIGHT_RED } Error: Local revision could not be obtained, please contact Pi-hole Support "
echo -e " Additional debugging output: ${ COL_NC } "
git status
2024-10-20 07:34:15 +00:00
exit 1
2018-07-20 20:22:37 +00:00
fi
if [ [ " ${# REMOTE } " = = 0 ] ] ; then
echo -e " \\n ${ COL_LIGHT_RED } Error: Remote revision could not be obtained, please contact Pi-hole Support "
echo -e " Additional debugging output: ${ COL_NC } "
git status
2024-10-20 07:34:15 +00:00
exit 1
2018-07-20 20:22:37 +00:00
fi
# Change back to original directory
2024-10-20 07:34:15 +00:00
cd " ${ curdir } " || exit 1
2018-07-20 20:22:37 +00:00
if [ [ " ${ LOCAL } " != " ${ REMOTE } " ] ] ; then
# Local branch is behind remote branch -> Update
return 0
else
# Local branch is up-to-date or in a situation
# where this updater cannot be used (like on a
# branch that exists only locally)
return 1
fi
2016-12-24 14:19:39 +00:00
}
2016-11-02 08:12:02 +00:00
main( ) {
2018-07-20 20:22:37 +00:00
local basicError = " \\n ${ COL_LIGHT_RED } Unable to complete update, please contact Pi-hole Support ${ COL_NC } "
local core_update
local web_update
local FTL_update
2016-12-24 14:40:31 +00:00
core_update = false
2018-07-20 20:22:37 +00:00
web_update = false
FTL_update = false
2021-09-12 20:38:55 +00:00
# Install packages used by this installation script (necessary if users have removed e.g. git from their systems)
package_manager_detect
2024-09-28 18:49:27 +00:00
build_dependency_package
install_dependent_packages
2021-09-12 20:38:55 +00:00
2018-07-20 20:22:37 +00:00
# This is unlikely
if ! is_repo " ${ PI_HOLE_FILES_DIR } " ; then
echo -e " \\n ${ COL_LIGHT_RED } Error: Core Pi-hole repo is missing from system! "
echo -e " Please re-run install script from https://pi-hole.net ${ COL_NC } "
exit 1;
2017-02-05 19:07:04 +00:00
fi
2018-07-20 20:22:37 +00:00
echo -e " ${ INFO } Checking for updates... "
if GitCheckUpdateAvail " ${ PI_HOLE_FILES_DIR } " ; then
core_update = true
echo -e " ${ INFO } Pi-hole Core:\\t ${ COL_YELLOW } update available ${ COL_NC } "
2017-02-05 19:07:04 +00:00
else
2018-07-20 20:22:37 +00:00
core_update = false
echo -e " ${ INFO } Pi-hole Core:\\t ${ COL_LIGHT_GREEN } up to date ${ COL_NC } "
2017-02-05 19:07:04 +00:00
fi
2016-11-02 14:29:20 +00:00
2023-02-05 18:39:48 +00:00
if ! is_repo " ${ ADMIN_INTERFACE_DIR } " ; then
echo -e " \\n ${ COL_LIGHT_RED } Error: Web Admin repo is missing from system! "
echo -e " Please re-run install script from https://pi-hole.net ${ COL_NC } "
exit 1;
fi
if GitCheckUpdateAvail " ${ ADMIN_INTERFACE_DIR } " ; then
web_update = true
echo -e " ${ INFO } Web Interface:\\t ${ COL_YELLOW } update available ${ COL_NC } "
else
web_update = false
echo -e " ${ INFO } Web Interface:\\t ${ COL_LIGHT_GREEN } up to date ${ COL_NC } "
2018-07-20 20:22:37 +00:00
fi
2016-11-02 14:29:20 +00:00
2019-12-04 20:09:34 +00:00
local funcOutput
funcOutput = $( get_binary_name) #Store output of get_binary_name here
local binary
binary = " pihole-FTL ${ funcOutput ##*pihole-FTL } " #binary name will be the last line of the output of get_binary_name (it always begins with pihole-FTL)
2024-10-18 19:26:18 +00:00
if FTLcheckUpdate " ${ binary } " & >/dev/null; then
2018-07-20 20:22:37 +00:00
FTL_update = true
echo -e " ${ INFO } FTL:\\t\\t ${ COL_YELLOW } update available ${ COL_NC } "
else
case $? in
1)
echo -e " ${ INFO } FTL:\\t\\t ${ COL_LIGHT_GREEN } up to date ${ COL_NC } "
; ;
2)
echo -e " ${ INFO } FTL:\\t\\t ${ COL_LIGHT_RED } Branch is not available. ${ COL_NC } \\n\\t\\t\\tUse ${ COL_LIGHT_GREEN } pihole checkout ftl [branchname] ${ COL_NC } to switch to a valid branch. "
; ;
2024-01-30 18:09:14 +00:00
3)
echo -e " ${ INFO } FTL:\\t\\t ${ COL_LIGHT_RED } Something has gone wrong, cannot reach download server ${ COL_NC } "
exit 1
; ;
2018-07-20 20:22:37 +00:00
*)
echo -e " ${ INFO } FTL:\\t\\t ${ COL_LIGHT_RED } Something has gone wrong, contact support ${ COL_NC } "
2024-01-30 18:09:14 +00:00
exit 1
2018-07-20 20:22:37 +00:00
esac
FTL_update = false
fi
2016-11-02 14:29:20 +00:00
2019-03-02 15:36:49 +00:00
# Determine FTL branch
local ftlBranch
if [ [ -f "/etc/pihole/ftlbranch" ] ] ; then
ftlBranch = $( </etc/pihole/ftlbranch)
else
ftlBranch = "master"
fi
2019-03-02 15:40:59 +00:00
if [ [ ! " ${ ftlBranch } " = = "master" && ! " ${ ftlBranch } " = = "development" ] ] ; then
2019-03-02 15:36:49 +00:00
# Notify user that they are on a custom branch which might mean they they are lost
# behind if a branch was merged to development and got abandoned
printf " %b %bWarning:%b You are using FTL from a custom branch (%s) and might be missing future releases.\\n" " ${ INFO } " " ${ COL_LIGHT_RED } " " ${ COL_NC } " " ${ ftlBranch } "
fi
2018-07-20 20:22:37 +00:00
if [ [ " ${ core_update } " = = false && " ${ web_update } " = = false && " ${ FTL_update } " = = false ] ] ; then
echo ""
echo -e " ${ TICK } Everything is up to date! "
exit 0
fi
2018-04-02 20:53:32 +00:00
2018-07-20 20:22:37 +00:00
if [ [ " ${ CHECK_ONLY } " = = true ] ] ; then
echo ""
exit 0
fi
2016-11-02 14:29:20 +00:00
2018-07-20 20:22:37 +00:00
if [ [ " ${ core_update } " = = true ] ] ; then
echo ""
echo -e " ${ INFO } Pi-hole core files out of date, updating local repo. "
getGitFiles " ${ PI_HOLE_FILES_DIR } " " ${ PI_HOLE_GIT_URL } "
echo -e " ${ INFO } If you had made any changes in '/etc/.pihole/', they have been stashed using 'git stash' "
fi
if [ [ " ${ web_update } " = = true ] ] ; then
echo ""
echo -e " ${ INFO } Pi-hole Web Admin files out of date, updating local repo. "
getGitFiles " ${ ADMIN_INTERFACE_DIR } " " ${ ADMIN_INTERFACE_GIT_URL } "
echo -e " ${ INFO } If you had made any changes in '/var/www/html/admin/', they have been stashed using 'git stash' "
fi
if [ [ " ${ FTL_update } " = = true ] ] ; then
echo ""
echo -e " ${ INFO } FTL out of date, it will be updated by the installer. "
fi
if [ [ " ${ FTL_update } " = = true || " ${ core_update } " = = true ] ] ; then
${ PI_HOLE_FILES_DIR } /automated\ install/basic-install.sh --reconfigure --unattended || \
2021-11-25 06:41:40 +00:00
echo -e " ${ basicError } " && exit 1
2018-07-20 20:22:37 +00:00
fi
2020-02-19 17:41:53 +00:00
2020-02-19 17:46:45 +00:00
if [ [ " ${ FTL_update } " = = true || " ${ core_update } " = = true || " ${ web_update } " = = true ] ] ; then
2022-10-06 10:36:17 +00:00
# Update local and remote versions via updatechecker
2020-02-19 17:41:53 +00:00
/opt/pihole/updatecheck.sh
echo -e " ${ INFO } Local version file information updated. "
fi
2024-09-30 19:04:55 +00:00
# if there was only a web update, show the new versions
# (on core and FTL updates, this is done as part of the installer run)
if [ [ " ${ web_update } " = = true && " ${ FTL_update } " = = false && " ${ core_update } " = = false ] ] ; then
" ${ PI_HOLE_BIN_DIR } " /pihole version
fi
2018-04-02 20:53:32 +00:00
echo ""
2018-07-20 20:22:37 +00:00
exit 0
2016-11-02 08:12:02 +00:00
}
2016-11-02 07:51:38 +00:00
2018-04-15 17:25:35 +00:00
if [ [ " $1 " = = "--check-only" ] ] ; then
2018-07-20 20:22:37 +00:00
CHECK_ONLY = true
2018-04-15 17:25:35 +00:00
fi
2016-11-02 08:12:02 +00:00
main