Actions
Mdns » Historial » Revisió 1
Revisió 1/6
| Següent »
Pau Escrich, 24-10-2013 15:13
Mdns¶
This is an example of bmx6 SMS plugin utilization. It is a distributed DNS system where every node publish the domains it is managing.
The current implementation is done for working in OpenWRT with the Dnsmasq daemon.
Usage:
- /etc/init.d/mdns start
- /etc/init.d/mdns start
- /etc/init.d/mdns reload
Files:
- /etc/mdns/public contains the list of domains we wanto to announce in the network
- /etc/mdns/hosts contains a list of "IP -> domain" which have been obtained from the network (dnsmasq looks on it)
#!/bin/sh
# Copyright (C) 2013 Pau Escrich <p4u@dabax.net>
#
# This program 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 2 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# The full GNU General Public License is included in this distribution in
# the file called "COPYING".
# Configuration variables
MDNS_DIR="/etc/mdns"
HOSTF="$MDNS_DIR/hosts"
MY_DOMAINS="$MDNS_DIR/public"
DOMAINS4="qmp"
DOMAINS6="qm6"
SMSF="/var/run/bmx6/sms/sendSms/mdns"
SMSR="/var/run/bmx6/sms/rcvdSms"
DNSMASQ="/etc/dnsmasq.conf"
DNSMASQ_PID="/var/run/dnsmasq.pid"
# Optional
IPV4=""
IPV6=""
start() {
if ! cat /etc/crontabs/root | grep mdns > /dev/null; then
echo "/10 * * * * /etc/init.d/mdns reload > /tmp/log/mdns.log" >> /etc/crontabs/root
/etc/init.d/cron enable
/etc/init.d/cron start
fi
/etc/init.d/mdns reload
}
stop() {
sed -i -e '/.*\/etc\/init\.d\/mdns reload > \/tmp\/log\/mdns\.log$/d' /etc/crontabs/root
/etc/init.d/cron restart
}
reload() {
init
publish_my_domains
get_domains
finish
}
refresh() {
reload
}
# Code
error() {
echo "ERROR: $@"
exit 1
}
log() {
echo -e "-> $@"
}
init() {
log "preparing bmx6"
bmx6 -c --syncSms mdns
[ $? -ne 0 ] && error "cannot configure bmx6 daemon"
cat $DNSMASQ | egrep "^addn-hosts=$HOSTF" -q || {
log "adding addn-host entry to dnsmasq config file"
echo "addn-hosts=$HOSTF" >> $DNSMASQ
log "restarting dnsmasq daemon"
/etc/init.d/dnsmasq restart
}
ps | grep dnsmasq -q || error "dnsmasq not running"
log "cleaning files"
[ -f $SMSF ] && rm -f $SMSF
touch $SMSF
[ -f $HOSTF ] && rm -f $HOSTF
touch $HOSTF
[ ! -d $MDNS_DIR ] && mkdir -p $MDNS_DIR
touch $MY_DOMAINS
}
check_domain() {
local v="$1"
local d="$2"
local valid=1
local domains=""
[ $v == "4" ] && domains="$DOMAINS4"
[ $v == "6" ] && domains="$DOMAINS6"
[ $v == "all" ] && domains="$DOMAINS4 $DOMAINS6"
for D in $domains; do
echo "$d" | egrep "\.$D"$ -q && valid=0 && break
done
return $valid
}
get_my_domains() {
local v=${1:-4}
local my_domains=""
local domains=""
local d
for d in $(cat $MY_DOMAINS); do
check_domain $v $d && my_domains="$d $my_domains"
done
[ "$v" == "4" ] && domains="$DOMAINS4"
[ "$v" == "6" ] && domains="$DOMAINS6"
for d in $domains; do
my_domains="$(cat /proc/sys/kernel/hostname).$d $my_domains"
done
echo $my_domains
}
get_my_ip4() {
[ -z $IPV4 ] && \
bmx6 -cp | grep tun4Address | awk '{print $2}' | awk -F / '{print $1}' || \
echo "$IPV4"
}
get_my_ip6() {
[ -z $IPV4 ] && \
bmx6 -cp | grep tun6Address | awk '{print $2}' | awk -F / '{print $1}' || \
echo "$IPV6"
}
publish_my_domains() {
local d domains
local ip4="$(get_my_ip4)"
local ip6="$(get_my_ip6)"
[ -z "$ip4$ip6" ] && error "cannot get ip address"
[ -n "$ip4" ] && {
domains="$(get_my_domains 4)"
log "publishing own IPv4 domains: $domains"
echo "$ip4 $domains" >> $SMSF
echo "$ip4 $domains" >> $HOSTF
}
[ -n "$ip6" ] && {
domains="$(get_my_domains 6)"
log "publishing own IPv6 domains: $domains"
echo "$ip6 $domains" >> $SMSF
echo "$ip6 $domains" >> $HOSTF
}
}
get_domains() {
local f d domline ip line n i
ls $SMSR/*:mdns 2>/dev/null >/dev/null && {
# for each received file
for f in $SMSR/*:mdns; do
n=$(cat $f | wc -l)
# for each line inside the file
for i in $(seq $n); do
line=$(cat $f | awk "NR==$i")
ip="$(echo $line | awk '{print $1}')"
[ -z $ip ] && continue
domains=""
# for each domain (first is IP)
for d in $(echo "$line" | awk '{$1=""; print $0}'); do
check_domain all $d && domains="$d $domains"
done
[ -n "$domains" ] && echo "$ip $domains" >> $HOSTF
log "added remote domains $domains= $ip"
done
done
} || log "not published domains found in the network"
}
finish() {
kill -SIGHUP $(cat $DNSMASQ_PID)
}
$@
Actualitzat per Pau Escrich fa més de 11 anys · 1 revisions