diff --git a/README.md b/README.md index 44d6535..b0e95d4 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,5 @@ In this manner, with this example, you can provide 3 access points at the same t ## Prerequisites -This app works with a non-stable version of YunoHost. - -Until this version is available (coming soon!) as an official stable release, you need to execute some commands before installing this app: - - # service bind9 stop - # update-rc.d bind9 remove - # apt-get install dnsmasq +* Debian Jessie +* YunoHost >= 2.2.0 diff --git a/TODO b/TODO index 6d25e1a..1c5d23a 100644 --- a/TODO +++ b/TODO @@ -1,4 +1 @@ * Translate PHP interface in French - -* multissid -** INIT: use insserv instead of update-rc.d and update service dependencies diff --git a/conf/iw_multissid b/conf/iw_multissid index 1ed65de..ca21bfb 100644 --- a/conf/iw_multissid +++ b/conf/iw_multissid @@ -18,5 +18,10 @@ # along with this program. If not, see . phy=$(iw "${1}" info | grep wiphy | awk '{ print $NF }') +multissid=$(iw "phy${phy}" info | grep -A1 'valid interface combinations' | tail -n1 | sed 's/.*{.*AP.*}\s<=\s\(.*\),.*/\1/') -iw "phy${phy}" info | grep -A1 'valid interface combinations' | tail -n1 | sed 's/.*{.*AP.*}\s<=\s\(.*\),.*/\1/' +if [ -z "${multissid}" ]; then + echo 1 +else + echo $multissid +fi diff --git a/conf/init_ynh-hotspot b/conf/ynh-hotspot similarity index 90% rename from conf/init_ynh-hotspot rename to conf/ynh-hotspot index 9614d37..57afe0c 100644 --- a/conf/init_ynh-hotspot +++ b/conf/ynh-hotspot @@ -1,28 +1,19 @@ #!/bin/bash -### BEGIN INIT INFO -# Provides: ynh-hotspot -# Required-Start: $network $remote_fs $syslog yunohost-api -# 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 - -# Wifi Hotspot app for YunoHost +# +# Wifi Hotspot app for YunoHost # Copyright (C) 2015 Julien Vaubourg # 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 . @@ -89,13 +80,13 @@ is_dhcpd4_running() { } is_hostapd_running() { - service hostapd status &> /dev/null + systemctl is-active hostapd &> /dev/null } is_running() { for i in $(seq 0 $((${ynh_multissid} - 1))); do - ( has_ip6delegatedprefix ${i} && is_ip6addr_set ${i} || ! has_ip6delegatedprefix ${i} )\ - && is_ip4nataddr_set ${i} && is_dhcpd6_running ${i} && is_dhcpd4_running ${i} + ( has_ip6delegatedprefix ${i} && is_ip6addr_set ${i} && is_dhcpd6_running ${i} || ! has_ip6delegatedprefix ${i} )\ + && is_ip4nataddr_set ${i} && is_dhcpd4_running ${i} if [ ! $? -eq 0 ]; then return 1 @@ -152,9 +143,7 @@ start_dhcpd6() { dev="hotspot${i}" fi - rm -f /etc/dnsmasq.dhcpd/dhcpdv6-ssid*.conf - - cp /etc/dnsmasq.dhcp/dhcpdv6{.conf.tpl,-ssid${i}.conf} + cp /etc/dnsmasq.dhcpd/dhcpdv6{.conf.tpl,-ssid${i}.conf} sed "s||${dev}|g" -i /etc/dnsmasq.dhcpd/dhcpdv6-ssid${i}.conf sed "s||${ynh_ip6_net[${i}]}|g" -i /etc/dnsmasq.dhcpd/dhcpdv6-ssid${i}.conf @@ -173,8 +162,6 @@ start_dhcpd4() { dev="hotspot${i}" fi - rm -f /etc/dnsmasq.dhcpd/dhcpdv4-ssid*.conf - cp /etc/dnsmasq.dhcpd/dhcpdv4{.conf.tpl,-ssid${i}.conf} sed "s||${ynh_ip4_dns0[${i}]}|g" -i /etc/dnsmasq.dhcpd/dhcpdv4-ssid${i}.conf @@ -201,7 +188,7 @@ start_hostapd() { sed "s||hotspot${i}|g" -i /etc/hostapd/hostapd.conf.tmp sed "s||${ynh_wifi_ssid[${i}]}|g" -i /etc/hostapd/hostapd.conf.tmp sed "s||${ynh_wifi_passphrase[${i}]}|g" -i /etc/hostapd/hostapd.conf.tmp - + if [ "${ynh_wifi_secure[${i}]}" -eq 1 ]; then sed "s|||g" -i /etc/hostapd/hostapd.conf.tmp else @@ -218,7 +205,7 @@ start_hostapd() { rm /etc/hostapd/hostapd.conf.tmp done - service hostapd start + systemctl start hostapd } ## Unsetters @@ -269,33 +256,41 @@ stop_dhcpd4() { } stop_hostapd() { - service hostapd stop + systemctl stop hostapd } ## Tools moulinette_get() { var=${1} + gotcha=0 - value=$(yunohost app setting hotspot "${var}") + while [ "${gotcha}" -eq 0 ]; do + value=$(yunohost app setting hotspot "${var}") - if [[ "${value}" =~ "An instance is already running" ]]; then - echo "${value}" >&2 - exit 1 - fi + if [[ "${value}" =~ "An instance is already running" ]]; then + sleep $(($((RANDOM%5)) + 1)) + else + gotcha=1 + fi + done echo "${value}" -} +} moulinette_vpnclient_get() { var=${1} + gotcha=0 - value=$(yunohost app setting vpnclient "${var}") + while [ "${gotcha}" -eq 0 ]; do + value=$(yunohost app setting vpnclient "${var}") - if [[ "${value}" =~ "An instance is already running" ]]; then - echo "${value}" >&2 - exit 1 - fi + if [[ "${value}" =~ "An instance is already running" ]]; then + sleep $(($((RANDOM%5)) + 1)) + else + gotcha=1 + fi + done echo "${value}" } @@ -317,13 +312,13 @@ if [ "$1" != restart ]; then # 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 + systemctl restart php5-fpm fi - + # Variables - + echo -n "Retrieving Yunohost settings... " - + ynh_service_enabled=$(moulinette_get service_enabled) ynh_wifi_device=$(moulinette_get wifi_device) ynh_wifi_channel=$(moulinette_get wifi_channel) @@ -342,23 +337,23 @@ if [ "$1" != restart ]; then 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 @@ -416,12 +411,16 @@ case "$1" in exit 1 fi - i=0; false || while [ $? -ne 0 ]; do - sleep 1 && (( i++ )) - [ ${i} -gt 20 ] && stop_hostapd - [ ${i} -gt 20 ] && exit 1 - ip link show dev "mon.${ynh_wifi_device}" &> /dev/null - done + if [ "${ynh_multissid}" -gt 1 ]; then + i=0; false || while [ $? -ne 0 ]; do + sleep 1 && (( i++ )) + [ ${i} -gt 20 ] && stop_hostapd + [ ${i} -gt 20 ] && exit 1 + ip link show dev hotspot1 &> /dev/null + done + else + sleep 1 + fi fi # For each registred ssid @@ -432,13 +431,13 @@ case "$1" in echo "hotspot${i}: Set IPv4 NAT address" set_ip4nataddr ${i} fi - + # Set the ipv6 address if has_ip6delegatedprefix ${i} && ! is_ip6addr_set ${i}; then echo "hotspot${i}: Set IPv6 address" set_ip6addr ${i} fi - + # Run DHCPv6 server if has_ip6delegatedprefix ${i} && ! is_dhcpd6_running ${i}; then echo "hotspot${i}: Start the NDP and DHCPv6 server (dnsmasq)" @@ -480,8 +479,8 @@ case "$1" in if has_ip6delegatedprefix ${i} && is_ip6addr_set ${i}; then echo "hotspot${i}: Unset IPv6 address" unset_ip6addr ${i} - fi - + fi + if is_dhcpd6_running ${i}; then echo "hotspot${i}: Stop the NDP and DHCPv6 server (dnsmasq)" stop_dhcpd6 ${i} @@ -498,8 +497,9 @@ case "$1" in stop_hostapd fi + # Fix configuration if has_vpnclient_app; then - service ynh-vpnclient start + ynh-vpnclient start fi ;; restart) @@ -541,7 +541,7 @@ case "$1" in if has_ip6delegatedprefix ${i}; then echo "[INFO] hotspot${i}: IPv6 delegated prefix found" echo "[INFO] hotspot${i}: IPv6 address computed from the delegated prefix: ${ynh_ip6_addr}" - + if is_ip6addr_set ${i}; then echo "[OK] hotspot${i}: IPv6 address set" else @@ -558,14 +558,14 @@ case "$1" in else echo "[INFO] hotspot${i}: No IPv6 delegated prefix found" fi - + if is_dhcpd4_running ${i}; then echo "[OK] hotspot${i}: DHCPv4 server (dnsmasq) is running" else echo "[ERR] hotspot${i}: NDP and DHCPv4 (dnsmasq) is not running" exitcode=1 fi - + if is_ip4nataddr_set ${i}; then echo "[OK] hotspot${i}: IPv4 NAT address set" else diff --git a/conf/ynh-hotspot.service b/conf/ynh-hotspot.service new file mode 100644 index 0000000..367601f --- /dev/null +++ b/conf/ynh-hotspot.service @@ -0,0 +1,13 @@ +[Unit] +Description=YunoHost Wifi Hotspot. +Requires=network.target +After=network.target + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/ynh-hotspot start +ExecStop=/usr/local/bin/ynh-hotspot stop +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/scripts/install b/scripts/install index 89d3db9..3724d6b 100644 --- a/scripts/install +++ b/scripts/install @@ -39,10 +39,10 @@ if [ "${ynh_version}" -lt 220 ]; then exit 1 fi -sudo service dnsmasq status &> /dev/null +sudo systemctl is-active dnsmasq &> /dev/null if [ $? -ne 0 ]; then - echo "ERROR: You need to enable dnsmasq instead of bind9 (apt-get remove bind9 && service dnsmasq start)" + echo "ERROR: You need to enable dnsmasq instead of bind9 (apt-get remove bind9 && systemctl start dnsmasq)" exit 1 fi @@ -191,7 +191,8 @@ sudo sed 's||/var/www/wifiadmin/|g' -i /etc/php5/fpm/pool.d/ sudo sed "s||${url_path}|g" -i /var/www/wifiadmin/config.php # Copy init script -sudo install -o root -g root -m 0755 ../conf/init_ynh-hotspot /etc/init.d/ynh-hotspot +sudo install -o root -g root -m 0755 ../conf/ynh-hotspot /usr/local/bin/ +sudo install -o root -g root -m 0644 ../conf/ynh-hotspot.service /etc/systemd/system/ # Update firewall for DHCP sudo yunohost firewall allow --no-upnp --ipv6 UDP 547 @@ -200,15 +201,13 @@ sudo yunohost firewall allow --no-upnp UDP 67 # Set default inits # The boot order of these services are important, so they are disabled by default # and the ynh-hotspot service handles them. -# All services are registred by yunohost in order to prevent conflicts after the uninstall. -sudo yunohost service add hostapd -sudo yunohost service stop hostapd -sudo yunohost service disable hostapd +sudo systemctl disable hostapd +sudo systemctl stop hostapd -sudo yunohost service add php5-fpm -sudo yunohost service enable php5-fpm +sudo systemctl enable php5-fpm +sudo systemctl restart php5-fpm -sudo service nginx reload +sudo systemctl reload nginx # Remove IPv6 address set if there is a VPN installed if [ "${ip6_addr}" != none ]; then @@ -218,9 +217,8 @@ if [ "${ip6_addr}" != none ]; then fi fi -sudo yunohost service add ynh-hotspot -sudo yunohost service enable ynh-hotspot -sudo service ynh-hotspot start +sudo systemctl enable ynh-hotspot +sudo systemctl start ynh-hotspot # Update SSO for wifiadmin sudo yunohost app ssowatconf diff --git a/scripts/remove b/scripts/remove index 9836e94..fa90214 100644 --- a/scripts/remove +++ b/scripts/remove @@ -21,9 +21,9 @@ domain=$(sudo yunohost app setting hotspot domain) # The End -sudo service ynh-hotspot stop -sudo yunohost service remove ynh-hotspot -sudo rm -f /etc/init.d/ynh-hotspot +sudo systemctl stop ynh-hotspot +sudo systemctl disable ynh-hotspot +sudo rm -f /etc/systemd/system/ynh-hotspot.service /usr/local/bin/ynh-hotspot sudo rm -f /tmp/.ynh-hotspot-* # Update firewall for DHCP @@ -41,9 +41,8 @@ sudo rm -f /lib/firmware/htc-7010.fw sudo rm -f /lib/firmware/htc-9271.fw # Restart services -sudo yunohost service stop php5-fpm -sudo yunohost service start php5-fpm -sudo service nginx reload +sudo systemctl restart php5-fpm +sudo systemctl reload nginx # Remove sources sudo rm -rf /var/www/wifiadmin/ diff --git a/sources/controller.php b/sources/controller.php index e752c6d..8f15ab2 100644 --- a/sources/controller.php +++ b/sources/controller.php @@ -27,23 +27,23 @@ function moulinette_set($var, $value) { } function stop_service() { - exec('sudo service ynh-hotspot stop'); + exec('sudo systemctl stop ynh-hotspot'); } function start_service() { - exec('sudo service ynh-hotspot start', $output, $retcode); + exec('sudo systemctl start ynh-hotspot', $output, $retcode); return $retcode; } function service_status() { - exec('sudo service ynh-hotspot status', $output); + exec('sudo ynh-hotspot status', $output); return $output; } function service_faststatus() { - exec('sudo service hostapd status', $output, $retcode); + exec('sudo systemctl is-active hostapd', $output, $retcode); return $retcode; } @@ -146,8 +146,8 @@ dispatch('/', function() { } $ip6_net = moulinette_get('ip6_net'); - $ip6_net = ($ip6_net == 'none') ? '' : $ip6_net; - $ip4_nat_prefix = moulinette_get('ip4_nat_prefix'); + $ip6_net = ($ip6_net == 'none') ? '' : getArray($ip6_net); + $ip4_nat_prefix = getArray(moulinette_get('ip4_nat_prefix')); set('service_enabled', moulinette_get('service_enabled')); set('ssids', $ssids); diff --git a/sources/public/css/style.css b/sources/public/css/style.css index d2f37aa..8cdf173 100644 --- a/sources/public/css/style.css +++ b/sources/public/css/style.css @@ -66,7 +66,7 @@ div#saveconfirmation { display: none; padding-right: 15px; width: 60%; - margin: 0 auto; + margin: 15px auto 0; } div#saveconfirmation div#confirm {