#!/usr/bin/env bash # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # edithosts.sh -- edit the dhcphosts file on the routing domain usage() { printf "Usage: %s: -m -4 -6 -h -d -n -s -u [-N]\n" $(basename $0) >&2 } mac= ipv4= ipv6= host= dflt= dns= routes= duid= nondefault= while getopts 'm:4:h:d:n:s:6:u:N' OPTION do case $OPTION in m) mac="$OPTARG" ;; 4) ipv4="$OPTARG" ;; 6) ipv6="$OPTARG" ;; u) duid="$OPTARG" ;; h) host="$OPTARG" ;; d) dflt="$OPTARG" ;; n) dns="$OPTARG" ;; s) routes="$OPTARG" ;; N) nondefault=1 ;; ?) usage exit 2 ;; esac done DHCP_HOSTS=/etc/dhcphosts.txt DHCP_OPTS=/etc/dhcpopts.txt DHCP_LEASES=/var/lib/misc/dnsmasq.leases HOSTS=/etc/hosts source /root/func.sh lock="biglock" locked=$(getLockFile $lock) if [ "$locked" != "1" ] then exit 1 fi grep "redundant_router=1" /var/cache/cloud/cmdline > /dev/null no_redundant=$? command -v dhcp_release > /dev/null 2>&1 no_dhcp_release=$? wait_for_dnsmasq () { local _pid=$(pidof dnsmasq) for i in 0 1 2 3 4 5 6 7 8 9 10 do sleep 1 _pid=$(pidof dnsmasq) [ "$_pid" != "" ] && break; done [ "$_pid" != "" ] && return 0; logger -t cloud "edithosts: timed out waiting for dnsmasq to start" return 1 } if [ $no_dhcp_release -eq 0 ] then #release previous dhcp lease if present logger -t cloud "edithosts: releasing $ipv4" dhcp_release lo $ipv4 $(grep $ipv4 $DHCP_LEASES | awk '{print $2}') > /dev/null 2>&1 logger -t cloud "edithosts: released $ipv4" fi logger -t cloud "edithosts: update $mac $ipv4 $ipv6 $host to hosts" [ ! -f $DHCP_HOSTS ] && touch $DHCP_HOSTS [ ! -f $DHCP_OPTS ] && touch $DHCP_OPTS [ ! -f $DHCP_LEASES ] && touch $DHCP_LEASES #delete any previous entries from the dhcp hosts file sed -i /$mac/d $DHCP_HOSTS if [ $ipv4 ] then sed -i /$ipv4,/d $DHCP_HOSTS fi if [ $ipv6 ] then sed -i /$ipv6,/d $DHCP_HOSTS fi # don't want to do this in the future, we can have same VM with multiple nics/entries #sed -i /$host,/d $DHCP_HOSTS #put in the new entry if [ $ipv4 ] then echo "$mac,$ipv4,$host,infinite" >>$DHCP_HOSTS fi if [ $ipv6 ] then if [ $nondefault ] then echo "id:$duid,set:nondefault6,[$ipv6],$host,infinite" >>$DHCP_HOSTS else echo "id:$duid,[$ipv6],$host,infinite" >>$DHCP_HOSTS fi fi #delete leases to supplied mac and ip addresses if [ $ipv4 ] then sed -i /$mac/d $DHCP_LEASES sed -i /"$ipv4 "/d $DHCP_LEASES fi if [ $ipv6 ] then sed -i /$duid/d $DHCP_LEASES sed -i /"$ipv6 "/d $DHCP_LEASES fi sed -i /"$host "/d $DHCP_LEASES #put in the new entry if [ $ipv4 ] then echo "0 $mac $ipv4 $host *" >> $DHCP_LEASES fi if [ $ipv6 ] then echo "0 $duid $ipv6 $host *" >> $DHCP_LEASES fi #edit hosts file as well if [ $ipv4 ] then sed -i /"$ipv4 "/d $HOSTS fi if [ $ipv6 ] then sed -i /"$ipv6 "/d $HOSTS fi sed -i /" $host$"/d $HOSTS if [ $ipv4 ] then echo "$ipv4 $host" >> $HOSTS fi if [ $ipv6 ] then echo "$ipv6 $host" >> $HOSTS fi if [ "$dflt" != "" ] then #make sure dnsmasq looks into options file sed -i /dhcp-optsfile/d /etc/dnsmasq.conf echo "dhcp-optsfile=$DHCP_OPTS" >> /etc/dnsmasq.conf tag=$(echo $ipv4 | tr '.' '_') sed -i /$tag/d $DHCP_OPTS if [ "$dflt" == "0.0.0.0" ] then logger -t cloud "$0: unset default router for $ipv4" logger -t cloud "$0: unset dns server for $ipv4" echo "$tag,3" >> $DHCP_OPTS echo "$tag,6" >> $DHCP_OPTS echo "$tag,15" >> $DHCP_OPTS fi [ "$routes" != "" ] && echo "$tag,121,$routes" >> $DHCP_OPTS #delete entry we just put in because we need a tag sed -i /$ipv4/d $DHCP_HOSTS #put it back with a tag echo "$mac,set:$tag,$ipv4,$host,infinite" >>$DHCP_HOSTS fi # make dnsmasq re-read files pid=$(pidof dnsmasq) if [ "$pid" != "" ] then # use SIGHUP to avoid service outage if dhcp_release is available. if [ $no_dhcp_release -eq 0 ] then kill -HUP $pid else service dnsmasq restart fi else if [ $no_redundant -eq 1 ] then wait_for_dnsmasq else logger -t cloud "edithosts: skip wait dnsmasq due to redundant virtual router" fi fi ret=$? unlock_exit $ret $lock $locked