New Samba AD DC DNS API
parent
377a37e4c9
commit
fb5082f858
|
@ -0,0 +1,130 @@
|
|||
#!/usr/bin/env sh
|
||||
|
||||
# Samba AD DC
|
||||
#
|
||||
# `samba-tool` binary is necessary.
|
||||
# On Debian, it can be installed with `apt-get install samba-common-bin`
|
||||
#
|
||||
# Then the following environment variable will need to be set:
|
||||
# SAMBA_HOST="dc1.example.com"
|
||||
# SAMBA_USER="Administrator"
|
||||
# SAMBA_PASS="fzaoiv23RGgqg"
|
||||
|
||||
# Author: Adnan RIHAN <adnan@rihan.fr>
|
||||
# Report Bugs here: https://github.com/acmesh-official/acme.sh/issues/4852
|
||||
#
|
||||
######## Public functions #####################
|
||||
#
|
||||
# Usage: dns_samba_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
|
||||
|
||||
dns_samba_add() {
|
||||
_debug 'Checking if `samba-tool` is available'
|
||||
if ! _exists samba-tool; then
|
||||
_err "samba-tool could not be found. Please install samba-common-bin"
|
||||
return 1
|
||||
fi
|
||||
|
||||
fulldomain=$1
|
||||
txtvalue=$2
|
||||
|
||||
SAMBA_HOST="${SAMBA_HOST:-$(_readaccountconf_mutable SAMBA_HOST)}"
|
||||
SAMBA_USER="${SAMBA_USER:-$(_readaccountconf_mutable SAMBA_USER)}"
|
||||
SAMBA_PASS="${SAMBA_PASS:-$(_readaccountconf_mutable SAMBA_PASS)}"
|
||||
|
||||
if [ -z "$SAMBA_HOST" ] || [ -z "$SAMBA_USER" ] || [ -z "$SAMBA_PASS" ]; then
|
||||
SAMBA_HOST=""
|
||||
SAMBA_USER=""
|
||||
SAMBA_PASS=""
|
||||
_err "You must specify a Samba host, username and password."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# save the credentials to the account conf file.
|
||||
_saveaccountconf_mutable SAMBA_HOST "$SAMBA_HOST"
|
||||
_saveaccountconf_mutable SAMBA_USER "$SAMBA_USER"
|
||||
_saveaccountconf_mutable SAMBA_PASS "$SAMBA_PASS"
|
||||
|
||||
if ! _get_zone $fulldomain; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
_debug "Adding \"$_subdomain\" = \"$txtvalue\" to $_zone"
|
||||
if ! samba-tool dns add "$SAMBA_HOST" "$_zone" "$_subdomain" TXT "$txtvalue" --username="$SAMBA_USER" --password="$SAMBA_PASS" 2>/dev/null; then
|
||||
_err "Couldn't add TXT field"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Usage: fulldomain txtvalue
|
||||
# Remove the txt record after validation.
|
||||
dns_samba_rm() {
|
||||
_debug 'Checking if `samba-tool` is available'
|
||||
if ! _exists samba-tool; then
|
||||
_err "samba-tool could not be found. Please install samba-common-bin"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
fulldomain=$1
|
||||
txtvalue=$2
|
||||
|
||||
SAMBA_HOST="${SAMBA_HOST:-$(_readaccountconf_mutable SAMBA_HOST)}"
|
||||
SAMBA_USER="${SAMBA_USER:-$(_readaccountconf_mutable SAMBA_USER)}"
|
||||
SAMBA_PASS="${SAMBA_PASS:-$(_readaccountconf_mutable SAMBA_PASS)}"
|
||||
|
||||
if [ -z "$SAMBA_HOST" ] || [ -z "$SAMBA_USER" ] || [ -z "$SAMBA_PASS" ]; then
|
||||
SAMBA_HOST=""
|
||||
SAMBA_USER=""
|
||||
SAMBA_PASS=""
|
||||
_err "You must specify a Samba host, username and password."
|
||||
return 1
|
||||
fi
|
||||
|
||||
# save the credentials to the account conf file.
|
||||
_saveaccountconf_mutable SAMBA_HOST "$SAMBA_HOST"
|
||||
_saveaccountconf_mutable SAMBA_USER "$SAMBA_USER"
|
||||
_saveaccountconf_mutable SAMBA_PASS "$SAMBA_PASS"
|
||||
|
||||
if ! _get_zone $fulldomain; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
_debug "Removing \"$_subdomain\" = \"$txtvalue\" from $_zone"
|
||||
if ! samba-tool dns delete "$SAMBA_HOST" "$_zone" "$_subdomain" TXT "$txtvalue" --username="$SAMBA_USER" --password="$SAMBA_PASS" 2>/dev/null; then
|
||||
_info "Couldn't remove TXT field, may be non existant. Ignoring error."
|
||||
fi
|
||||
}
|
||||
|
||||
#################### Private functions below ##################################
|
||||
|
||||
_get_zone() {
|
||||
_fulldomain=$1
|
||||
|
||||
_debug 'Retrieving samba zonelist'
|
||||
_subdomain=""
|
||||
_zone=""
|
||||
if ! _zones=$(samba-tool dns zonelist "$SAMBA_HOST" --username="$SAMBA_USER" --password="$SAMBA_PASS" 2>/dev/null | grep pszZoneName | cut -d: -f2 | sed 's/ //g'); then
|
||||
_err "Couldn't contact Samba AD DC host"
|
||||
return 1
|
||||
fi
|
||||
|
||||
_debug 'Loop in zonelist to find the correct zone:'
|
||||
for z in $_zones; do
|
||||
_debug " Checking \"$z\" against \"$_fulldomain\""
|
||||
if _endswith "$_fulldomain" ".$z"; then
|
||||
_debug " Found! \"$_fulldomain\" ends with \".$z\""
|
||||
_zone=$z
|
||||
_subdomain=${fulldomain%.$z}
|
||||
break
|
||||
elif [ "$_fulldomain" = "$z" ]; then
|
||||
_debug " Found! \"$_fulldomain\" == \"$z\""
|
||||
_zone=$z
|
||||
_subdomain="@"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$_zone" ]; then
|
||||
_err "Can't find a corresponding zone for this domain"
|
||||
return 1
|
||||
fi
|
||||
}
|
Loading…
Reference in New Issue