2017-05-19 14:45:57 +02:00
#!/usr/bin/env bash
#############################################################################
# Update webmin/usermin to the latest develop version from GitHub repo
# inspired by authentic-theme/theme-update.sh script, thanks qooob
#
2018-01-31 11:56:55 +01:00
# Version 1.4, 2018-01-31
2018-01-31 17:14:06 +01:00
#
2017-05-19 14:45:57 +02:00
# Kay Marquardt, kay@rrr.de, https://github.com/gandelwartz
#############################################################################
# Get webmin/usermin dir based on script's location
DIR = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
PROD = ${ DIR ##*/ } # => usermin or webmin
# where to get source
HOST = "https://github.com"
REPO = " webmin/ $PROD "
ASK = "YES"
2017-12-27 14:39:37 +00:00
GIT = "git"
2017-05-19 14:45:57 +02:00
# temporary locations for git clone
WTEMP = " ${ DIR } /.~files/webadmin "
UTEMP = " ${ DIR } /.~files/useradmin "
TEMP = $WTEMP
[ [ " $PROD " = = "usermin" ] ] && TEMP = $UTEMP
2017-06-27 15:36:56 +02:00
LTEMP = " ${ DIR } /.~lang "
2017-05-19 14:45:57 +02:00
2018-02-01 17:24:55 +01:00
# don't ask -y given
if [ [ " $1 " = = "-y" || " $1 " = = "-yes" ] ] ; then
ASK = "NO"
shift
fi
2017-05-19 14:45:57 +02:00
2018-02-01 17:24:55 +01:00
# predefined colors for echo -e on terminal
if [ [ -t 1 && ${ ASK } = = "YES" ] ] ; then
RED = '\e[49;0;31;82m'
BLUE = '\e[49;1;34;182m'
GREEN = '\e[49;32;5;82m'
ORANGE = '\e[49;0;33;82m'
PURPLE = '\e[49;1;35;82m'
LGREY = '\e[49;1;37;182m'
GREY = '\e[1;30m'
CYAN = '\e[36m'
NC = '\e[0m'
fi
2017-05-19 14:45:57 +02:00
# help requested output usage
if [ [ " $1 " = = "-h" || " $1 " = = "--help" ] ] ; then
2018-01-31 17:37:24 +01:00
echo -e " ${ NC } ${ ORANGE } This is the unofficial webmin update script ${ NC } "
echo " Usage: ./`basename $0 ` [-yes] [-repo:username/xxxmin] [-release[:number]] "
[ [ " $1 " = = "--help" ] ] && cat <<EOF
Parameters:
-yes
unattended install, do not ask
-repo
pull from alternative github repo, format: -repo:username/reponame
reponame can be "webmin" or "usermin"
default github repo: webmin/webmin
-release
pull a released version, default release: -release:latest
Exit codes:
0 - success
1 - abort on error or user request, nothing changed
2 - not run as root
3 - git not found
4 - stage 1: git clone failed
5 - stage 2: makedist failed
6 - stage 3: update with setup.sh failed, installation may in bad state!
EOF
2017-05-19 14:45:57 +02:00
exit 0
fi
2017-12-21 20:45:58 +01:00
if [ [ " ${ PROD } " != "webmin" && " ${ PROD } " != "usermin" ] ] ; then
2017-12-21 21:19:36 +01:00
echo -e " ${ NC } ${ RED } error: the current dir name hast to be webmin or usermin, no update possible! ${ NC } "
echo -e " possible solution: ${ ORANGE } ln -s ${ PROD } ../webmini; cd ../webmin ${ NC } or ${ ORANGE } ln -s ${ PROD } ../usermin; cd ../webmin ${ NC } "
2018-01-31 17:14:06 +01:00
exit 1
2017-12-21 20:45:58 +01:00
fi
2018-01-31 11:56:55 +01:00
# need to be root
if [ [ $EUID -ne 0 ] ] ; then
echo -e " ${ RED } Error: This command has to be run under the root user. ${ NC } "
2018-01-31 17:14:06 +01:00
exit 2
2018-01-31 11:56:55 +01:00
fi
2017-05-19 14:45:57 +02:00
2018-01-31 11:56:55 +01:00
# git has to be installed
2017-12-27 14:39:37 +00:00
echo -en " ${ CYAN } search minserv.conf ... ${ NC } "
if [ [ -f "/etc/webmin/miniserv.conf" ] ] ; then
2018-01-31 11:56:55 +01:00
# default location
2017-12-27 14:39:37 +00:00
MINICONF = "/etc/webmin/miniserv.conf"
else
# possible other locations
MINICONF = ` find /* -maxdepth 6 -name miniserv.conf 2>/dev/null | grep ${ PROD } | head -n 1`
echo -e " ${ ORANGE } found: ${ MINICONF } ${ NC } (alternative location) "
fi
2018-01-25 10:50:55 +00:00
[ [ " ${ MINICONF } " != "" ] ] && export PATH = " ${ PATH } :`grep path= ${ MINICONF } | sed 's/^path=//'` "
2017-12-27 14:39:37 +00:00
2018-01-31 17:14:06 +01:00
if type ${ GIT } >/dev/null 2>& 1 ; then
true
else
echo -e " ${ RED } Error: Command \`git\` is not installed or not in the \`PATH\`. ${ NC } "
exit 3
fi
2018-01-31 11:56:55 +01:00
################
# lets start
# Clear screen for better readability
[ [ " ${ ASK } " = = "YES" ] ] && clear
2017-05-19 14:45:57 +02:00
# alternative repo given
if [ [ " $1 " = = *"-repo" * ] ] ; then
if [ [ " $1 " = = *":" * ] ] ; then
REPO = ${ 1 ##* : }
2017-12-21 20:45:58 +01:00
[ [ " ${ REPO ##*/ } " != "webmin" && " ${ REPO ##*/ } " != "usermin" ] ] && echo -e " ${ RED } error: ${ ORANGE } ${ REPO } is not a valid repo name! ${ NC } " && exit 0
2017-05-19 14:45:57 +02:00
shift
else
2017-05-21 14:26:36 +02:00
echo -e " ${ ORANGE } ./`basename $0 `: ${ NC } found -repo without parameter "
2018-01-31 17:14:06 +01:00
exit 1
2017-05-19 14:45:57 +02:00
fi
fi
# warn about possible side effects because webmins makedist.pl try cd to /usr/local/webmin (and more)
[ [ -d "/usr/local/webadmin" ] ] && echo -e " ${ RED } Warning: ${ NC } /usr/local/webadmin ${ ORANGE } exist, update may fail! ${ NC } "
################
# really update?
REPLY = "y"
2018-01-31 11:56:55 +01:00
[ [ " $1 " != "-release" * ] ] && echo -e " ${ RED } Warning: ${ NC } ${ ORANGE } update from non release repository ${ NC } $HOST / $REPO ${ ORANGE } may break your installation! ${ NC } "
2017-05-19 14:45:57 +02:00
[ " ${ ASK } " = = "YES" ] && read -p "Would you like to update " ${ PROD ^ } " from ${ HOST } / ${ REPO } [y/N] " -n 1 -r && echo
if [ [ ! $REPLY = ~ ^[ Yy] $ ] ] ; then
# something different the y entered
echo -e " ${ PURPLE } Operation aborted. ${ NC } "
2018-01-31 17:14:06 +01:00
exit 1
2017-05-19 14:45:57 +02:00
fi
################
# here we go
2018-01-31 11:56:55 +01:00
# remove temporary files from failed run
rm -rf .~files
# pull source from github
if [ [ " $1 " = = *"-release" * ] ] ; then
2017-05-19 14:45:57 +02:00
if [ [ " $1 " = = *":" * ] ] && [ [ " $1 " != *"latest" * ] ] ; then
RRELEASE = ${ 1 ##* : }
else
2017-05-21 15:29:36 +02:00
RRELEASE = ` curl -s -L https://github.com/${ REPO } /blob/master/version | sed -n '/id="LC1"/s/.*">\([^<]*\).*/\1/p' `
2017-05-19 14:45:57 +02:00
fi
2018-01-07 16:04:34 +00:00
echo -e " ${ CYAN } Pulling in latest release of ${ NC } ${ ORANGE } ${ PROD ^ } ${ NC } $RRELEASE ( $HOST / $REPO )... "
2017-12-21 20:45:58 +01:00
RS = " $( ${ GIT } clone --depth 1 --branch $RRELEASE -q $HOST /$REPO .git " ${ TEMP } " 2>& 1) "
2017-05-19 14:45:57 +02:00
if [ [ " $RS " = = *"ould not find remote branch" * ] ] ; then
ERROR = " Release ${ RRELEASE } doesn't exist. "
fi
2018-01-31 11:56:55 +01:00
else
2018-01-07 16:04:34 +00:00
echo -e " ${ CYAN } Pulling in latest changes for ${ NC } ${ ORANGE } ${ PROD ^ } ${ NC } $RRELEASE ( $HOST / $REPO ) ... "
2017-12-21 20:45:58 +01:00
${ GIT } clone --depth 1 --quiet $HOST /$REPO .git " ${ TEMP } "
2018-01-31 11:56:55 +01:00
fi
# on usermin!! pull also webmin to resolve symlinks later!
WEBMREPO = ` echo ${ REPO } | sed " s/\/usermin $/\/webmin/ " `
if [ [ " ${ REPO } " != " ${ WEBMREPO } " ] ] ; then
2018-01-07 16:04:34 +00:00
echo -e " ${ CYAN } Pulling in latest changes for ${ NC } ${ ORANGE } Webmin ${ NC } ( $HOST / $WEBMREPO ) ... "
2017-12-21 20:45:58 +01:00
${ GIT } clone --depth 1 --quiet $HOST /$WEBMREPO .git " ${ WTEMP } "
2018-01-31 11:56:55 +01:00
fi
2017-05-19 14:45:57 +02:00
2018-01-31 11:56:55 +01:00
# Check for possible errors
if [ $? -eq 0 ] && [ -f " ${ TEMP } /version " ] ; then
2017-05-19 14:45:57 +02:00
####################
# start processing pulled source
2018-01-07 16:04:34 +00:00
version = " `head -c -1 ${ TEMP } /version`-`cd ${ TEMP } ; ${ GIT } log -1 --format=%cd --date=format:'%m%d.%H%M'` "
2018-01-31 15:41:46 +01:00
DOTVER = ` echo ${ version } | sed 's/-/./' `
TARBALL = " ${ TEMP } /tarballs/ ${ PROD } - ${ DOTVER } "
2018-01-31 11:56:55 +01:00
###############
# FULL update
echo -e " ${ CYAN } start FULL update for ${ NC } $PROD ... "
2018-01-31 15:41:46 +01:00
# create missing dirs, simulate authentic present
mkdir ${ TEMP } /tarballs ${ TEMP } /authentic-theme
cp authentic-theme/LICENSE ${ TEMP } /authentic-theme
# run makedist.pl
( cd ${ TEMP } ; perl makedist.pl ${ DOTVER } )
2018-02-01 17:24:55 +01:00
if [ [ ! -f " ${ TEMP } /tarballs/webmin- ${ DOTVER } .tar.gz " ] ] ; then
2018-01-31 15:41:46 +01:00
echo -e " ${ RED } Error: makedist.pl failed! ${ NC } aborting ... "
rm -rf .~files
2018-01-31 17:14:06 +01:00
exit 5
2018-01-31 15:41:46 +01:00
fi
2018-01-31 11:56:55 +01:00
# check for additional standard modules
# fixed list better than guessing?
for module in ` ls */module.info`
do
2018-01-31 15:41:46 +01:00
if [ [ -f ${ TEMP } /${ module } && ! -f " ${ TARBALL } / $module " ] ] ; then
2017-05-20 10:26:43 +02:00
module = ` dirname $module `
2018-01-31 15:41:46 +01:00
echo " Adding nonstandard $module " && cp -r -L ${ TARBALL } /
2017-05-20 10:26:43 +02:00
fi
2018-01-31 11:56:55 +01:00
done
2018-01-31 15:41:46 +01:00
# prepeare unattended upgrade
echo " ${ version } " >" ${ TARBALL } /version "
cp " ${ TEMP } /chinese-to-utf8.pl " .
2018-01-31 11:56:55 +01:00
echo -en " ${ CYAN } search for config dir ... ${ NC } "
config_dir = ` grep env_WEBMIN_CONFIG = ${ MINICONF } | sed 's/.*_WEBMIN_CONFIG=//' `
echo -e " ${ ORANGE } found: ${ config_dir } ${ NC } "
atboot = "NO"
makeboot = "NO"
nouninstall = "YES"
#nostart="YES"
export config_dir atboot nouninstall makeboot nostart
2018-01-31 15:41:46 +01:00
( cd ${ TARBALL } ; ./setup.sh ${ DIR } ) | grep -v -e " ^ $" -e " done $" -e "chmod" -e "chgrp" -e "chown"
2018-01-31 17:14:06 +01:00
if [ [ " ${ TARBALL } /version " -nt " ${ MINICONF } " ] ] ; then
2018-01-31 17:18:03 +01:00
echo -e " ${ RED } Error: update failed, ${ PROD } may in a bad state! ${ NC } aborting ... "
2018-01-31 17:14:06 +01:00
rm -rf .~files
exit 6
fi
2017-05-19 14:45:57 +02:00
2017-12-21 21:19:36 +01:00
#############
# postprocessing
2017-06-27 12:45:53 +02:00
2017-12-21 20:45:58 +01:00
# "compile" UTF-8 lang files
echo -en " \n ${ CYAN } compile UTF-8 lang files ${ NC } ... "
2017-12-21 21:19:36 +01:00
if [ [ ` which iconv 2> /dev/null` != '' ] ] ; then
2018-02-01 17:24:55 +01:00
perl " ${ TEMP } /chinese-to-utf8.pl " . 2>& 1 | while read input; do echo -n "." ; done
2017-12-21 20:45:58 +01:00
else
2017-12-21 21:19:36 +01:00
echo -e " ${ BLUE } iconv not found, skipping lang files! ${ NC } "
fi
2017-06-27 12:45:53 +02:00
2017-05-19 14:45:57 +02:00
# update authentic, put dummy clear in PATH
2017-05-21 15:23:52 +02:00
echo -e "#!/bin/sh\necho" > ${ TEMP } /clear; chmod +x ${ TEMP } /clear
2017-05-19 14:45:57 +02:00
export PATH = " ${ TEMP } : ${ PATH } "
2017-05-21 15:23:52 +02:00
# check if alternatve repo exist
AUTHREPO = ` echo ${ REPO } | sed " s/\/.*min $/\/autehtic-theme/ " `
if [ [ " ${ REPO } " != " ${ AUTHREPO } " ] ] ; then
exist = ` curl -s -L ${ HOST } /${ AUTHREPO } `
[ [ " ${# exist } " -lt 20 ] ] && RREPO = " ${ AUTHREPO } "
fi
[ [ -x authentic-theme/theme-update.sh ] ] && authentic-theme/theme-update.sh ${ RREPO }
2017-05-19 14:45:57 +02:00
2018-01-31 11:56:55 +01:00
else
2017-05-19 14:45:57 +02:00
# something went wrong
echo -e " ${ RED } ${ ERROR } Updating files, failed. ${ NC } "
2018-01-31 17:14:06 +01:00
exit 4
2018-01-31 11:56:55 +01:00
fi
###########
# we are at the end, clean up
# remove temporary files
echo -e " \n ${ BLUE } clean up temporary files ... ${ NC } "
rm -rf .~files .~lang
# fix permissions, should be done by makedist.pl?
echo -e " ${ CYAN } make scripts executable ... ${ NC } "
chmod -R -x+X ${ DIR }
chmod +x *.pl *.cgi *.pm *.sh */*.pl */*.cgi */*.pm */*.sh
2017-12-21 20:45:58 +01:00
2018-01-31 11:56:55 +01:00
# thats all folks
echo -e " \n ${ CYAN } Updating ${ PROD ^ } to Version `cat version`, done. ${ NC } "
2018-01-31 17:14:06 +01:00
# update success
exit 0