#!/bin/bash # _____ _ _ # | __|___ ___ ___ _| |___ _____| |_ ___ ___ ___ # | __| _| -_| -_| . | . | | . | . | | -_| # |__| |_| |___|___|___|___|_|_|_|___|___|_|_|___| # # Freedom in the Cloud # # Avahi functions # # License # ======= # # Copyright (C) 2014-2018 Bob Mottram # # 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 . function create_avahi_service { service_name=$1 service_type=$2 service_protocol=$3 service_port=$4 service_description="$5" if [ ! -d /etc/avahi ]; then echo $'create_avahi_service: avahi was not installed' exit 52925 fi { echo ''; echo ''; echo ''; echo " %h ${service_type}"; echo ' '; echo " _${service_type}._${service_protocol}"; echo " ${service_port}"; } > "/etc/avahi/services/${service_name}.service" if [ "$service_description" ]; then echo " $service_description" >> "/etc/avahi/services/${service_name}.service" fi { echo ' '; echo ''; } >> "/etc/avahi/services/${service_name}.service" } function mesh_avahi { # shellcheck disable=SC2154 chroot "$rootdir" apt-get -yq install avahi-utils avahi-dnsconfd decarray=( 1 2 3 4 5 6 7 8 9 0 ) PEER_ID=${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]} sed -i "s|#host-name=.*|host-name=P$PEER_ID|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|host-name=.*|host-name=P$PEER_ID|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i 's|#domain-name=.*|domain-name=local|g' "$rootdir/etc/avahi/avahi-daemon.conf" sed -i 's|domain-name=.*|domain-name=local|g' "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|use-ipv4=.*|use-ipv4=no|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|use-ipv6=.*|use-ipv6=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" # Note: wlan interfaces must be allowed within avahi, otherwise the # *.local address will not resolve sed -i "s|#allow-interfaces|allow-interfaces|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|allow-interfaces=.*|allow-interfaces=wlan0, wlan1, wlan2, wlan3, wlan4, wlan5, eth0, eth1|g" "$rootdir/etc/avahi/avahi-daemon.conf" #sed -i "s|#deny-interfaces=.*|deny-interfaces=eth0, eth1, eth2, eth3, eth4, eth5|g" "$rootdir/etc/avahi/avahi-daemon.conf" #sed -i "s|deny-interfaces=.*|deny-interfaces=eth0, eth1, eth2, eth3, eth4, eth5|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|#disallow-other-stacks=.*|disallow-other-stacks=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|disallow-other-stacks=.*|disallow-other-stacks=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|#publish_addresses=.*|publish_addresses=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|publish_addresses=.*|publish_addresses=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|#publish-hinfo=.*|publish-hinfo=no|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|publish-hinfo=.*|publish-hinfo=no|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|#publish-workstation=.*|publish-workstation=no|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|publish-workstation=.*|publish-workstation=no|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|#publish-domain=.*|publish-domain=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|publish-domain=.*|publish-domain=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|#publish-a-on-ipv6=.*|publish-a-on-ipv6=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" sed -i "s|publish-a-on-ipv6=.*|publish-a-on-ipv6=yes|g" "$rootdir/etc/avahi/avahi-daemon.conf" if [ ! -d "$rootdir/etc/avahi/services" ]; then mkdir -p "$rootdir/etc/avahi/services" fi # remove an avahi service which isn't used if [ -f "$rootdir/etc/avahi/services/udisks.service" ]; then rm "$rootdir/etc/avahi/services/udisks.service" fi # Add a mesh routing protocol service { echo ''; echo ''; echo ''; echo ' %h routing'; echo ' '; echo ' _bmx6._tcp'; echo ' '; echo ''; } > "$rootdir/etc/avahi/services/routing.service" # keep the daemon running WATCHDOG_SCRIPT_NAME="keepon" { echo ''; echo '# keep avahi daemon running'; echo "AVAHI_RUNNING=\$(systemctl is-active avahi-daemon >/dev/null 2>&1 && echo Running)"; echo "if [ ! \$AVAHI_RUNNING ]; then"; echo ' systemctl start avahi-daemon'; echo " echo -n \$CURRENT_DATE >> \$LOGFILE"; echo " echo \" Avahi daemon restarted\" >> \$LOGFILE"; echo 'fi'; } >> "$rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME" chmod +x "$rootdir/usr/bin/$WATCHDOG_SCRIPT_NAME" } function keep_avahi_running { WATCHDOG_SCRIPT_NAME="keepon" if grep -q "avahi daemon" "/usr/bin/$WATCHDOG_SCRIPT_NAME"; then return fi { echo ''; echo '# keep avahi daemon running'; echo "AVAHI_RUNNING=\$(systemctl is-active avahi-daemon >/dev/null 2>&1 && echo Running)"; echo "if [ ! \$AVAHI_RUNNING ]; then"; echo ' systemctl start avahi-daemon'; echo " echo -n \$CURRENT_DATE >> \$LOGFILE"; echo " echo \" Avahi daemon restarted\" >> \$LOGFILE"; echo 'fi'; echo '# End of avahi'; } >> "/usr/bin/$WATCHDOG_SCRIPT_NAME" chmod +x "/usr/bin/$WATCHDOG_SCRIPT_NAME" # This is a bit of a hack to ensure that avahi services get broadcast # Without this some other systems may not be able to see the server { echo '#!/bin/bash'; echo 'systemctl restart avahi-daemon'; } > /usr/bin/restartavahi chmod +x /usr/bin/restartavahi cron_add_mins 10 /usr/bin/restartavahi } function install_avahi { if [ "$INSTALLING_MESH" ]; then mesh_avahi return fi if [[ $(is_completed "${FUNCNAME[0]}") == "1" ]]; then return fi # only enable avahi if we're doing mesh networking if [[ $ENABLE_BATMAN != "yes" ]]; then return fi if ! "${PROJECT_NAME}-mesh-install" -f avahi; then echo $'Failed to install avahi' exit 68442 fi if [ "$DEFAULT_DOMAIN_NAME" ]; then sed -i "s|#host-name=.*|host-name=$LOCAL_NAME|g" /etc/avahi/avahi-daemon.conf sed -i "s|host-name=.*|host-name=$LOCAL_NAME|g" /etc/avahi/avahi-daemon.conf else decarray=( 1 2 3 4 5 6 7 8 9 0 ) PEER_ID=${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]}${decarray[$RANDOM%10]} sed -i "s|#host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf sed -i "s|host-name=.*|host-name=P$PEER_ID|g" /etc/avahi/avahi-daemon.conf fi sed -i 's|#domain-name=.*|domain-name=local|g' /etc/avahi/avahi-daemon.conf sed -i 's|domain-name=.*|domain-name=local|g' /etc/avahi/avahi-daemon.conf mark_completed "${FUNCNAME[0]}" } function configure_firewall_for_avahi { if [[ $(is_completed "${FUNCNAME[0]}") == "1" ]]; then return fi iptables -A INPUT -p tcp --dport 548 -j ACCEPT iptables -A INPUT -p udp --dport 548 -j ACCEPT iptables -A INPUT -p tcp --dport 5353 -j ACCEPT iptables -A INPUT -p udp --dport 5353 -j ACCEPT iptables -A INPUT -p tcp --dport 5354 -j ACCEPT iptables -A INPUT -p udp --dport 5354 -j ACCEPT function_check save_firewall_settings save_firewall_settings mark_completed "${FUNCNAME[0]}" } # NOTE: deliberately there is no "exit 0"