#!/bin/sh # storage-tools - Additional utilities to manage storage related tasks # Copyright (C) 2014-2017 Daniel Baumann # # 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 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 General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e PROGRAM="$(basename ${0})" Parameters () { GETOPT_LONGOPTIONS="number:,release:,zone:,with-reverse,with-round-robin,master:,mds:,mgr:,mon:,osd:,rgw:," GETOPT_OPTIONS="n:,r:,z:,f:," PARAMETERS="$(getopt --longoptions ${GETOPT_LONGOPTIONS} --name=${PROGRAM} --options ${GETOPT_OPTIONS} --shell sh -- ${@})" if [ "${?}" != "0" ] then echo "'${PROGRAM}': getopt exit" >&2 exit 1 fi eval set -- "${PARAMETERS}" while true do case "${1}" in -n|--number) NUMBER="${2}" shift 2 ;; -r|--release) RELEASE="${2}" shift 2 ;; -z|--zone) ZONE="${2}" shift 2 ;; --with-reverse) WITH_REVERSE="true" shift 1 ;; --with-round-robin) WITH_ROUND_ROBIN="true" shift 1 ;; --master) MASTER="${2}" shift 2 ;; --mds) MDS="${2}" shift 2 ;; --mgr) MGR="${2}" shift 2 ;; --mon) MON="${2}" shift 2 ;; --osd) OSD="${2}" shift 2 ;; --rgw) RGW="${2}" shift 2 ;; --) shift 1 break ;; *) echo "'${PROGRAM}': getopt error" >&2 exit 1 ;; esac done } Usage () { echo "Usage: ${PROGRAM} {create|check} [-n|--number NUMBER] [-r|--release RELEASE] [-z|--zone ZONE] [--with-reverse] [--with-round-robin] [--master MASTER_NUMBER] [--mds MDS_NUMBER] [--mgr MGR_NUMBER] [--mon MON_NUMBER] [--osd OSD_NUMBER] [--rgw RGW_NUMBER]" >&2 exit 1 } case "${1}" in check) ACTION="check" ;; create) ACTION="create" ;; *) Usage ;; esac shift 1 Parameters "${@}" NUMBER="${NUMBER:-3}" RELEASE="${RELEASE:-luminous}" ZONE="${ZONE:-ceph.example.net}" MASTER="${MASTER:-1}" MDS="${MDS:-${NUMBER}}" MGR="${MGR:-${NUMBER}}" MON="${MON:-${NUMBER}}" OSD="${OSD:-${NUMBER}}" RGW="${RGW:-${NUMBER}}" RED="$(tput setaf 1)$(tput bold)" GREEN="$(tput setaf 2)$(tput bold)" WHITE="$(tput setaf 7)$(tput bold)" NORMAL="$(tput sgr0)" STATUS_GOOD="${GREEN}✔${NORMAL}" STATUS_BAD="${RED}✘${NORMAL}" STATUS_UGLY="${WHITE}○${NORMAL}" cat << EOF ; Ceph DNS: Forward Entries for ${ZONE} EOF # Run forward zone for SERVICE in master mds mgr mon osd rgw do NUMBERS="$(eval "echo \$$(echo "${SERVICE}" | tr [a-z] [A-Z])")" for NUMBER in $(seq 1 ${NUMBERS}) do case "${SERVICE}" in master) CONTAINER="master" ;; *) CONTAINER="${SERVICE}${NUMBER}" ;; esac case "${CHECK}" in true) IP_ADDRESS="$(dig +short ${CONTAINER}.${RELEASE}.${ZONE} | tail -n1)" if [ -n "${IP_ADDRESS}" ] then IP_ADDRESS="${IP_ADDRESS} ${STATUS_GOOD}" else IP_ADDRESS="${STATUS_BAD}" fi ;; *) IP_ADDRESS="FIXME" ;; esac cat << EOF ${CONTAINER}.${RELEASE}.${ZONE} IN A ${IP_ADDRESS} ${CONTAINER}.${ZONE} IN CNAME ${CONTAINER}.${RELEASE}.${ZONE}. EOF case "${SERVICE}" in master) ;; *) if [ "${WITH_ROUND_ROBIN}" = "true" ] then cat << EOF ${SERVICE}.${RELEASE}.${ZONE} IN A ${IP_ADDRESS} ${SERVICE}.${ZONE} IN A ${IP_ADDRESS} EOF fi ;; esac done done case "${WITH_REVERSE}" in true) cat << EOF ; Ceph DNS: Reverse Entries for ${ZONE} EOF # Run reverse zone for SERVICE in master mds mgr mon osd rgw do NUMBERS="$(eval "echo \$$(echo "${SERVICE}" | tr [a-z] [A-Z])")" for NUMBER in $(seq 1 ${NUMBERS}) do case "${SERVICE}" in master) CONTAINER="master" ;; *) CONTAINER="${SERVICE}${NUMBER}" ;; esac case "${CHECK}" in true) IP_ADDRESS="$(dig +short ${CONTAINER}.${RELEASE}.${ZONE} | tail -n1)" if [ -n "${IP_ADDRESS}" ] then HOST="$(dig +short -x ${IP_ADDRESS} | tail -n1)" if [ -n "${HOST}" ] then STATUS="${STATUS_GOOD}" else STATUS="${STATUS_BAD}" fi else STATUS="${STATUS_BAD}" IP_ADDRESS="Nil" fi ;; *) IP_ADDRESS="FIXME" ;; esac cat << EOF ${IP_ADDRESS} IN PTR ${CONTAINER}.${RELEASE}.${ZONE}. ${STATUS} EOF done done ;; esac