Files
smartdns/package/linux/install

250 lines
4.7 KiB
Bash

#!/bin/sh
#
# Copyright (C) 2018-2020 Ruilin Peng (Nick) <pymumu@gmail.com>.
#
# smartdns is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# smartdns is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
INST_DIR=$(cd $(dirname $0);pwd)
ISWSL=1 # 1 means not WSL, 0 means wsl
showhelp()
{
echo "Usage: install [OPTION]"
echo "Options:"
echo " -i install smartdns."
echo " -u uninstall smartdns."
echo " --prefix [dir] prefix directory."
echo " -h show this message."
}
start_service()
{
if [ $ISSYSTEMD -ne 0 ]; then
chkconfig smartdns on >/dev/null 2>&1
service smartdns start
return $?
fi
systemctl daemon-reload
systemctl enable smartdns
systemctl start smartdns
}
stop_service()
{
if [ $ISSYSTEMD -ne 0 ]; then
service smartdns stop
chkconfig smartdns off >/dev/null 2>&1
return 0
fi
systemctl stop smartdns
systemctl disable smartdns
return 0
}
clean_service()
{
if [ $ISSYSTEMD -ne 0 ]; then
return 0
fi
systemctl daemon-reload
}
get_systemd_path()
{
service="`systemctl --no-legend| grep '\.service' | head -n 1 | awk '{print $1}'`"
SERVICE_PATH="`systemctl show $service | grep FragmentPath | awk -F'=' '{print $2}'`"
dirname $SERVICE_PATH
}
install_files()
{
install -v -d $SMARTDNS_CONF_DIR
if [ $? -ne 0 ]; then
return 1
fi
install -v -m 0755 -t $PREFIX/usr/sbin usr/sbin/smartdns
if [ $? -ne 0 ]; then
return 1
fi
if [ -e "$PREFIX$SMARTDNS_CONF_DIR/smartdns.conf" ]; then
cp etc/smartdns/smartdns.conf $PREFIX$SMARTDNS_CONF_DIR/smartdns.conf.pkg
else
install -v -m 0640 -t $PREFIX$SMARTDNS_CONF_DIR etc/smartdns/smartdns.conf
if [ $? -ne 0 ]; then
return 1
fi
fi
install -v -m 0640 -t $PREFIX/etc/default etc/default/smartdns
if [ $? -ne 0 ]; then
return 1
fi
install -v -m 0755 -t $SMARTDNS_INIT_DIR etc/init.d/smartdns
if [ $? -ne 0 ]; then
if [ $ISSYSTEMD -ne 0 ]; then
return 1
fi
fi
if [ $ISSYSTEMD -eq 0 ]; then
SYSTEM_UNIT_PATH="`get_systemd_path`"
if [ -z "$SYSTEM_UNIT_PATH" ]; then
return 1
fi
install -v -m 0644 -t $PREFIX$SYSTEM_UNIT_PATH systemd/smartdns.service
if [ $? -ne 0 ]; then
return 1
fi
fi
return 0
}
uninstall_smartdns()
{
if [ -z "$PREFIX" ]; then
stop_service 2>/dev/null
fi
rmdir $PREFIX$SMARTDNS_CONF_DIR 2>/dev/null
rm -f $PREFIX/usr/sbin/smartdns
rm -f $PREFIX/etc/default/smartdns
if [ $ISWSL -eq 0 ]; then
sed -i '\#%sudo ALL=NOPASSWD: /etc/init.d/smartdns#d' /etc/sudoers 2>/dev/null
fi
if [ $ISSYSTEMD -eq 0 ]; then
SYSTEM_UNIT_PATH="`get_systemd_path`"
if [ ! -z "$SYSTEM_UNIT_PATH" ]; then
rm -f $PREFIX$SYSTEM_UNIT_PATH/smartdns.service
fi
fi
if [ -z "$PREFIX" ]; then
clean_service
fi
}
install_smartdns()
{
local ret
which smartdns >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "Already installed."
return 1
fi
install_files
ret=$?
if [ $ret -ne 0 ]; then
uninstall_smartdns
return $ret
fi
if [ -z "$PREFIX" ]; then
start_service
fi
if [ $ISWSL -eq 0 ]; then
grep "%sudo ALL=NOPASSWD: /etc/init.d/smartdns" /etc/sudoers >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "%sudo ALL=NOPASSWD: /etc/init.d/smartdns" >> /etc/sudoers
fi
fi
return 0
}
init_dir()
{
local ID=`id -u`
if [ $ID -ne 0 ]; then
echo "Please run as root."
return 1
fi
SMARTDNS_CONF_DIR=$PREFIX/etc/smartdns
SMARTDNS_INIT_DIR=$PREFIX/etc/init.d
which systemctl >/dev/null 2>&1
ISSYSTEMD="$?"
# Running under WSL (Windows Subsystem for Linux)?
cat /proc/version | grep -E '[Mm]icrosoft' >/dev/null 2>&1;
if [ $? -eq 0 ]; then
ISSYSTEMD=1
ISWSL=0
fi
cd $INST_DIR
}
main()
{
ACTION=""
OPTS=`getopt -o iuh --long help,prefix: \
-n "" -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$OPTS"
while true; do
case "$1" in
--prefix)
PREFIX="$2"
shift 2;;
-h | --help )
showhelp
return 0
shift ;;
-i )
ACTION="INSTALL"
shift ;;
-u )
ACTION="UNINSTALL"
shift ;;
-- ) shift; break ;;
* ) break ;;
esac
done
init_dir
if [ -z "$ACTION" ]; then
showhelp
return 0
elif [ "$ACTION" = "INSTALL" ]; then
install_smartdns
return $?
elif [ "$ACTION" = "UNINSTALL" ]; then
uninstall_smartdns
return 0
fi
}
main $@
exit $?