1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/hotspot_ynh.git synced 2024-09-03 19:25:53 +02:00
hotspot_ynh/conf/init_ynh-hotspot

478 lines
12 KiB
Text
Raw Normal View History

#!/bin/bash
### BEGIN INIT INFO
# Provides: ynh-hotspot
# Required-Start: $network $remote_fs $syslog $all
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Set prerequisites for wifi hotspot.
# Description: Set prerequisites for wifi hotspot.
### END INIT INFO
2014-12-26 20:18:03 +01:00
# Wifi Hotspot app for YunoHost
# Copyright (C) 2015 Julien Vaubourg <julien@vaubourg.com>
# Contribute at https://github.com/jvaubourg/hotspot_ynh
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Functions
## State functions
has_vpnclient_app() {
[ -e /tmp/.ynh-vpnclient-started ]
}
2014-11-10 22:27:59 +01:00
has_ip6delegatedprefix() {
[ "${ynh_ip6_net}" != none ]
}
is_nat_set() {
internet_device=${1}
iptables -nvt nat -L POSTROUTING | grep MASQUERADE | grep -q "${internet_device}"
}
is_ip4nataddr_set() {
ip address show dev "${ynh_wifi_device}" 2> /dev/null | grep -q "${ynh_ip4_nat_prefix}.1/24"
}
is_ip6addr_set() {
ip address show dev "${ynh_wifi_device}" 2> /dev/null | grep -q "${ynh_ip6_addr}/64"
}
is_forwarding_set() {
ip6=$(sysctl net.ipv6.conf.all.forwarding | awk '{ print $NF; }')
ip4=$(sysctl net.ipv4.conf.all.forwarding | awk '{ print $NF; }')
[ "${ip6}" -eq 1 -a "${ip4}" -eq 1 ]
}
2014-12-26 18:58:58 +01:00
is_dhcpdv6_set() {
[ -e /etc/dnsmasq.d/dhcpdv6.conf ]
}
is_dhcpdv4_set() {
[ -e /etc/dnsmasq.d/dhcpdv4.conf ]
}
is_hostapd_running() {
service hostapd status &> /dev/null
2014-12-26 18:58:58 +01:00
if [ $? -eq 0 ]; then
# If the wifi antenna was unplugged
if ip link show dev "${ynh_wifi_device}" | grep -q DOWN; then
service hostapd stop &> /dev/null
return 1
fi
return 0
fi
return 1
}
2014-12-26 18:58:58 +01:00
is_dnsmasq_running() {
service dnsmasq status &> /dev/null
}
is_running() {
( has_ip6delegatedprefix && is_ip6addr_set && is_dhcpdv6_set || ! has_ip6delegatedprefix )\
2014-11-10 22:27:59 +01:00
&& is_nat_set "${new_internet_device}" && is_ip4nataddr_set && is_forwarding_set && is_hostapd_running\
2014-12-26 18:58:58 +01:00
&& is_dhcpdv4_set && is_dnsmasq_running
}
## Setters
set_nat() {
internet_device=${1}
iptables -t nat -A POSTROUTING -o "${internet_device}" -j MASQUERADE
}
set_ip4nataddr() {
ip address add "${ynh_ip4_nat_prefix}.1/24" dev "${ynh_wifi_device}"
}
set_ip6addr() {
ip address delete "${ynh_ip6_addr}/64" dev tun0 &> /dev/null
ip address add "${ynh_ip6_addr}/64" dev "${ynh_wifi_device}"
}
set_forwarding() {
sysctl -w net.ipv6.conf.all.forwarding=1 > /dev/null
sysctl -w net.ipv4.conf.all.forwarding=1 > /dev/null
}
2014-12-26 18:58:58 +01:00
set_dhcpd() {
if has_ip6delegatedprefix; then
cp /etc/dnsmasq.d.tpl/dhcpdv6.conf.tpl /etc/dnsmasq.d/dhcpdv6.conf
sed "s|<TPL:WIFI_DEVICE>|${ynh_wifi_device}|g" -i /etc/dnsmasq.d/dhcpdv6.conf
sed "s|<TPL:IP6_NET>|${ynh_ip6_net}|g" -i /etc/dnsmasq.d/dhcpdv6.conf
sed "s|<TPL:IP6_DNS0>|${ynh_ip6_dns0}|g" -i /etc/dnsmasq.d/dhcpdv6.conf
sed "s|<TPL:IP6_DNS1>|${ynh_ip6_dns1}|g" -i /etc/dnsmasq.d/dhcpdv6.conf
fi
cp /etc/dnsmasq.d.tpl/dhcpdv4.conf.tpl /etc/dnsmasq.d/dhcpdv4.conf
sed "s|<TPL:IP4_DNS0>|${ynh_ip4_dns0}|g" -i /etc/dnsmasq.d/dhcpdv4.conf
sed "s|<TPL:IP4_DNS1>|${ynh_ip4_dns1}|g" -i /etc/dnsmasq.d/dhcpdv4.conf
sed "s|<TPL:WIFI_DEVICE>|${ynh_wifi_device}|g" -i /etc/dnsmasq.d/dhcpdv4.conf
sed "s|<TPL:IP4_NAT_PREFIX>|${ynh_ip4_nat_prefix}|g" -i /etc/dnsmasq.d/dhcpdv4.conf
}
start_hostapd() {
cp /etc/hostapd/hostapd.conf{.tpl,}
sed "s|<TPL:WIFI_DEVICE>|${ynh_wifi_device}|g" -i /etc/hostapd/hostapd.conf
sed "s|<TPL:WIFI_SSID>|${ynh_wifi_ssid}|g" -i /etc/hostapd/hostapd.conf
sed "s|<TPL:WIFI_PASSPHRASE>|${ynh_wifi_passphrase}|g" -i /etc/hostapd/hostapd.conf
sed "s|<TPL:WIFI_CHANNEL>|${ynh_wifi_channel}|g" -i /etc/hostapd/hostapd.conf
2014-11-09 23:49:06 +01:00
if [ "${ynh_wifi_n}" -eq 1 ]; then
sed "s|<TPL:N_COMMENT>||g" -i /etc/hostapd/hostapd.conf
else
sed "s|<TPL:N_COMMENT>|#|g" -i /etc/hostapd/hostapd.conf
fi
if [ "${ynh_wifi_secure}" -eq 1 ]; then
sed "s|<TPL:SEC_COMMENT>||g" -i /etc/hostapd/hostapd.conf
else
sed "s|<TPL:SEC_COMMENT>|#|g" -i /etc/hostapd/hostapd.conf
fi
service hostapd start
}
## Unsetters
unset_nat() {
internet_device=${1}
iptables -t nat -D POSTROUTING -o "${internet_device}" -j MASQUERADE
}
unset_ip4nataddr() {
ip address delete "${ynh_ip4_nat_prefix}.1/24" dev "${ynh_wifi_device}"
}
unset_ip6addr() {
ip address delete "${ynh_ip6_addr}/64" dev "${ynh_wifi_device}"
}
2014-12-26 18:58:58 +01:00
unset_dhcpd() {
rm -f /etc/dnsmasq.d/dhcpdv?.conf
service dnsmasq restart
}
unset_forwarding() {
sysctl -w net.ipv6.conf.all.forwarding=0 > /dev/null
sysctl -w net.ipv4.conf.all.forwarding=0 > /dev/null
}
stop_hostapd() {
service hostapd stop
}
## Tools
moulinette_get() {
var=${1}
value=$(yunohost app setting hotspot "${var}")
if [[ "${value}" =~ "An instance is already running" ]]; then
echo "${value}" >&2
exit 1
fi
echo "${value}"
}
2014-11-17 23:44:18 +01:00
moulinette_vpnclient_get() {
var=${1}
value=$(yunohost app setting vpnclient "${var}")
if [[ "${value}" =~ "An instance is already running" ]]; then
echo "${value}" >&2
exit 1
fi
echo "${value}"
}
moulinette_set() {
var=${1}
value=${2}
msg=$(yunohost app setting hotspot "${var}" -v "${value}")
if [ ! $? -eq 0 ]; then
echo "${msg}" >&2
exit 1
fi
}
2014-12-28 23:27:39 +01:00
if [ "$1" != restart ]; then
2014-11-25 21:05:24 +01:00
2014-12-28 23:27:39 +01:00
# Restart php5-fpm at the first start (it needs to be restarted after the slapd start)
if [ ! -e /tmp/.ynh-hotspot-boot ]; then
touch /tmp/.ynh-hotspot-boot
service php5-fpm restart
fi
2014-11-25 21:05:24 +01:00
2014-12-28 23:27:39 +01:00
# Variables
echo -n "Retrieving Yunohost settings... "
ynh_service_enabled=$(moulinette_get service_enabled)
2014-12-28 23:27:39 +01:00
ynh_wifi_device=$(moulinette_get wifi_device)
ynh_wifi_ssid=$(moulinette_get wifi_ssid)
ynh_wifi_secure=$(moulinette_get wifi_secure)
2014-12-28 23:27:39 +01:00
ynh_wifi_passphrase=$(moulinette_get wifi_passphrase)
ynh_wifi_channel=$(moulinette_get wifi_channel)
ynh_wifi_n=$(moulinette_get wifi_n)
ynh_ip6_addr=$(moulinette_get ip6_addr)
ynh_ip6_net=$(moulinette_get ip6_net)
ynh_ip6_dns0=$(moulinette_get ip6_dns0)
ynh_ip6_dns1=$(moulinette_get ip6_dns1)
ynh_ip4_dns0=$(moulinette_get ip4_dns0)
ynh_ip4_dns1=$(moulinette_get ip4_dns1)
ynh_ip4_nat_prefix=$(moulinette_get ip4_nat_prefix)
old_internet_device=$(moulinette_get internet_device)
new_internet_device=$(ip route | awk '/default via/ { print $NF; }')
# Switch the NAT interface if there is a VPN
ip link show dev tun0 &> /dev/null
if [ "$?" -eq 0 ]; then
new_internet_device=tun0
fi
echo "OK"
# Check IPv6 delegated prefix from vpnclient
vpnclient_ip6_net=$(moulinette_vpnclient_get ip6_net)
if [ ! -z "${vpnclient_ip6_addr}" ]; then
if [ "${ynh_ip6_net}" == none ]; then
ynh_ip6_net=$vpnclient_ip6_net
ynh_ip6_addr=$(moulinette_vpnclient_get ip6_addr)
moulinette_set ip6_net "${ynh_ip6_net}"
moulinette_set ip6_addr "${ynh_ip6_addr}"
else
if [ "${ynh_ip6_net}" != "${vpnclient_ip6_net}" ]; then
echo "[WARN] The IPv6 delegated prefix is different from the vpnclient one"
fi
2014-11-25 21:05:24 +01:00
fi
2014-11-17 23:44:18 +01:00
fi
2014-12-28 23:27:39 +01:00
2014-11-17 23:44:18 +01:00
fi
# Script
case "$1" in
start)
if is_running; then
echo "Already started"
elif [ "${ynh_service_enabled}" -eq 0 ]; then
echo "Disabled service"
else
echo "[hotspot] Starting..."
touch /tmp/.ynh-hotspot-started
if [ "${new_internet_device}" == tun0 ]; then
moulinette_set vpnclient yes
else
moulinette_set vpnclient no
fi
# Check old state of the ipv4 NAT settings
if [ ! -z "${old_internet_device}" -a "${new_internet_device}" != "${old_internet_device}" ]\
&& is_nat_set "${old_internet_device}"; then
unset_nat "${old_internet_device}"
fi
# Set ipv4 NAT
if ! is_nat_set "${new_internet_device}"; then
echo "Set NAT"
set_nat "${new_internet_device}"
fi
# Set ipv4 NAT address
if ! is_ip4nataddr_set; then
echo "Set IPv4 NAT address"
set_ip4nataddr
fi
# Set the ipv6 address
2014-11-10 22:27:59 +01:00
if has_ip6delegatedprefix && ! is_ip6addr_set; then
echo "Set IPv6 address"
set_ip6addr
fi
# Set forwarding for ipv6 and ipv4
if ! is_forwarding_set; then
echo "Set forwarding"
set_forwarding
fi
2015-03-17 00:35:34 +01:00
# Run hostapd
if ! is_hostapd_running; then
echo "Run hostapd"
start_hostapd
fi
2014-12-26 18:58:58 +01:00
# Run DHCP servers
if ( has_ip6delegatedprefix && ! is_dhcpdv6_set ) || ! is_dhcpdv4_set; then
echo "Set DHCP servers (dnsmasq)"
set_dhcpd
fi
2015-03-17 00:35:34 +01:00
service bind9 stop &> /dev/null
service dnsmasq restart
# Update dynamic settings
moulinette_set internet_device "${new_internet_device}"
fi
;;
stop)
echo "[hotspot] Stopping..."
2014-12-26 18:58:58 +01:00
rm -f /tmp/.ynh-hotspot-started
if is_nat_set "${old_internet_device}"; then
echo "Unset NAT"
unset_nat "${old_internet_device}"
fi
if is_ip4nataddr_set; then
echo "Unset IPv4 NAT address"
unset_ip4nataddr
fi
2014-11-10 22:27:59 +01:00
if has_ip6delegatedprefix && is_ip6addr_set; then
echo "Unset IPv6 address"
unset_ip6addr
fi
if is_forwarding_set; then
echo "Unset forwarding"
unset_forwarding
fi
2014-12-26 18:58:58 +01:00
if is_dhcpdv6_set || is_dhcpdv4_set; then
echo "Stop DHCP servers"
unset_dhcpd
fi
if is_hostapd_running; then
echo "Stop hostapd"
stop_hostapd
fi
if has_vpnclient_app; then
service ynh-vpnclient start
fi
;;
2014-12-28 15:38:05 +01:00
restart)
$0 stop
$0 start
;;
status)
exitcode=0
2014-11-20 20:03:24 +01:00
if [ "${ynh_service_enabled}" -eq 0 ]; then
echo "[ERR] Hotspot Service disabled"
exitcode=1
fi
2014-11-20 20:03:24 +01:00
echo "[INFO] Autodetected internet interface: ${new_internet_device} (last start: ${old_internet_device})"
2014-11-10 22:27:59 +01:00
if has_ip6delegatedprefix; then
2014-11-17 23:44:18 +01:00
echo "[INFO] IPv6 delegated prefix found"
2014-11-20 20:03:24 +01:00
echo "[INFO] IPv6 address computed from the delegated prefix: ${ynh_ip6_addr}"
2014-11-17 23:44:18 +01:00
2014-11-10 22:27:59 +01:00
if is_ip6addr_set; then
2014-11-17 23:44:18 +01:00
echo "[OK] IPv6 address set"
2014-11-10 22:27:59 +01:00
else
2014-11-17 23:44:18 +01:00
echo "[ERR] No IPv6 address set"
2014-11-10 22:27:59 +01:00
exitcode=1
fi
2014-12-26 18:58:58 +01:00
if is_dhcpdv6_set; then
echo "[OK] SLAAC & DHCPv6 server set"
2014-11-10 22:27:59 +01:00
else
2014-12-26 18:58:58 +01:00
echo "[ERR] No SLAAC & DHCPv6 server set"
2014-11-10 22:27:59 +01:00
exitcode=1
fi
else
2014-11-17 23:44:18 +01:00
echo "[INFO] No IPv6 delegated prefix found"
fi
2014-12-26 18:58:58 +01:00
if is_dhcpdv4_set; then
echo "[OK] DHCPv4 server set"
else
echo "[ERR] No DHCPv4 server set"
exitcode=1
fi
if is_nat_set "${new_internet_device}"; then
2014-11-17 23:44:18 +01:00
echo "[OK] IPv4 NAT set"
else
2014-11-17 23:44:18 +01:00
echo "[ERR] No IPv4 NAT set"
exitcode=1
fi
if is_ip4nataddr_set; then
2014-11-17 23:44:18 +01:00
echo "[OK] IPv4 NAT address set"
else
2014-11-17 23:44:18 +01:00
echo "[ERR] No IPv4 NAT address set"
exitcode=1
fi
if is_forwarding_set; then
2014-11-17 23:44:18 +01:00
echo "[OK] IPv6/IPv4 forwarding set"
else
2014-11-17 23:44:18 +01:00
echo "[ERR] No IPv6/IPv4 forwarding set"
exitcode=1
fi
2014-12-26 18:58:58 +01:00
if is_dnsmasq_running; then
echo "[OK] Dnsmasq is running"
else
2014-12-26 18:58:58 +01:00
echo "[ERR] Dnsmasq is not running"
exitcode=1
fi
2014-12-26 18:58:58 +01:00
if is_hostapd_running; then
echo "[OK] Hostapd is running"
else
2014-12-26 18:58:58 +01:00
echo "[ERR] Hostapd is not running"
exitcode=1
fi
exit ${exitcode}
;;
*)
2014-12-28 15:38:05 +01:00
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit 0