From dbabbf83905667d18a7de5412883a10d3ff565d4 Mon Sep 17 00:00:00 2001 From: DjoSmer Date: Tue, 27 Feb 2024 15:43:45 +0500 Subject: [PATCH 1/3] Add custom wildcard dns records. --- advanced/Scripts/webpage.sh | 142 ++++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/advanced/Scripts/webpage.sh b/advanced/Scripts/webpage.sh index 62ab4ea9..7ec7ba8f 100755 --- a/advanced/Scripts/webpage.sh +++ b/advanced/Scripts/webpage.sh @@ -19,6 +19,8 @@ readonly FTLconf="/etc/pihole/pihole-FTL.conf" readonly dhcpstaticconfig="/etc/dnsmasq.d/04-pihole-static-dhcp.conf" readonly dnscustomfile="/etc/pihole/custom.list" readonly dnscustomcnamefile="/etc/dnsmasq.d/05-pihole-custom-cname.conf" +readonly dnsCustomWildcardDNSFile="/etc/dnsmasq.d/15-pihole-custom-wildcarddns.conf" +readonly dnsCustomWildcardDNSDir="/etc/dnsmasq.d/15-pihole-custom-wildcarddns.d" readonly gravityDBfile="/etc/pihole/gravity.db" @@ -829,6 +831,143 @@ RemoveCustomCNAMERecord() { fi } +InitCustomWildcardDNSRecord() { + if [[ -f ${dnsCustomWildcardDNSFile} ]]; then + return 1; + fi + + echo -e " ${TICK} Init custom Wildcard DNS record..." + + echo "conf-dir=${dnsCustomWildcardDNSDir}" >> "${dnsCustomWildcardDNSFile}" + mkdir -p dnsCustomWildcardDNSDir +} + +AddCustomWildcardDNSRecord() { + InitCustomWildcardDNSRecord + + echo -e " ${TICK} Adding custom Wildcard DNS record..." + + wildcardName="${args[2]}" + domain="${args[3]}" + ip="${args[4]}" + enabled="${args[5]}" + reload="${args[6]}" + + validWildcardName="$(checkDomain "${wildcardName}")" + if [[ -z ${validWildcardName} ]]; then + echo " ${CROSS} Invalid Wildcard DNS Name passed!" + exit 1 + fi + + wildcardFilename="${dnsCustomWildcardDNSDir}/${wildcardName}.conf" + + validDomain="$(checkDomain "${domain}")" + if [[ -z "${validDomain}" ]]; then + echo " ${CROSS} Invalid Domain passed!" + exit 1 + fi + + existDomain=$(grep "/${validDomain}/" "${wildcardFilename}" 2> /dev/null) + if [[ -n "${existDomain}" ]]; then + echo " ${CROSS} Domain exists!" + exit 1 + fi + + if valid_ip "${ip}" && valid_ip6 "${ip}" ; then + echo -e " ${CROSS} Invalid IP has been passed" + exit 1 + fi + + if [[ ! $enabled == "false" ]]; then + enabled="" + else + enabled="#" + fi + + echo "${enabled}address=/${validDomain}/${ip}" >> "${wildcardFilename}" + + # Restart dnsmasq to load new custom CNAME records only if reload is not false + if [[ ! $reload == "false" ]]; then + RestartDNS + fi +} + +UpdateCustomWildcardDNSRecord() { + echo -e " ${TICK} Updating custom Wildcard DNS record..." + + wildcardName="${args[2]}" + domain="${args[3]}" + ip="${args[4]}" + enabled="${args[5]}" + reload="${args[6]}" + + wildcardFilename="${dnsCustomWildcardDNSDir}/${wildcardName}.conf" + + if [[ ! -f ${wildcardFilename} ]]; then + echo " ${CROSS} Invalid Name passed!" + exit 1 + fi + + validDomain="$(checkDomain "${domain}")" + if [[ -z "${validDomain}" ]]; then + echo " ${CROSS} Invalid Domain passed!" + exit 1 + fi + + if valid_ip "${ip}" && valid_ip6 "${ip}" ; then + echo -e " ${CROSS} Invalid IP has been passed" + exit 1 + fi + + address=/${domain}/${ip} + + if [[ $enabled == "false" ]]; then + sed -i '' -e "s|address=${address}|#address=${address}|" "${wildcardFilename}" + else + sed -i '' -e "s|#address=${address}|address=${address}|" "${wildcardFilename}" + fi + + # Restart dnsmasq to update removed custom CNAME records only if $reload not false + if [[ ! $reload == "false" ]]; then + RestartDNS + fi +} + +RemoveCustomWildcardDNSRecord() { + echo -e " ${TICK} Removing custom Wildcard DNS record..." + + wildcardName="${args[2]}" + domain="${args[3]}" + reload="${args[4]}" + + wildcardFilename="${dnsCustomWildcardDNSDir}/${wildcardName}.conf" + + if [[ ! -f ${wildcardFilename} ]]; then + echo " ${CROSS} Invalid Name passed!" + exit 1 + fi + + validDomain="$(checkDomain "${domain}")" + if [[ -z "${validDomain}" ]]; then + echo " ${CROSS} Invalid Domain passed!" + exit 1 + fi + + validDomain=$(escapeDots "${validDomain}") + sed -i "/address=\/${validDomain}\//Id" "${wildcardFilename}" + + #If a file is empty a system removes it + isEmptyFile=$(grep "address=" "${wildcardFilename}" 2> /dev/null) + if [[ -z "${isEmptyFile}" ]]; then + rm "$wildcardFilename"; + fi + + # Restart dnsmasq to update removed custom CNAME records only if $reload not false + if [[ ! $reload == "false" ]]; then + RestartDNS + fi +} + SetRateLimit() { local rate_limit_count rate_limit_interval reload rate_limit_count="${args[2]}" @@ -878,6 +1017,9 @@ main() { "removecustomdns" ) RemoveCustomDNSAddress;; "addcustomcname" ) AddCustomCNAMERecord;; "removecustomcname" ) RemoveCustomCNAMERecord;; + "addcustomwildcarddns" ) AddCustomWildcardDNSRecord;; + "updatecustomwildcarddns" ) UpdateCustomWildcardDNSRecord;; + "removecustomwildcarddns" ) RemoveCustomWildcardDNSRecord;; "ratelimit" ) SetRateLimit;; * ) helpFunc;; esac From e65f35e17e6e0c24229ce9178f45e96bf3d0b753 Mon Sep 17 00:00:00 2001 From: DjoSmer Date: Fri, 1 Mar 2024 18:24:04 +0500 Subject: [PATCH 2/3] upd: we can remove all domains in a group. --- advanced/Scripts/webpage.sh | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/advanced/Scripts/webpage.sh b/advanced/Scripts/webpage.sh index 7ec7ba8f..373fd552 100755 --- a/advanced/Scripts/webpage.sh +++ b/advanced/Scripts/webpage.sh @@ -947,18 +947,22 @@ RemoveCustomWildcardDNSRecord() { exit 1 fi - validDomain="$(checkDomain "${domain}")" - if [[ -z "${validDomain}" ]]; then - echo " ${CROSS} Invalid Domain passed!" - exit 1 - fi + if [[ "${domain}" != "*" ]]; then + validDomain="$(checkDomain "${domain}")" + if [[ -z "${validDomain}" ]]; then + echo " ${CROSS} Invalid Domain passed!" + exit 1 + fi - validDomain=$(escapeDots "${validDomain}") - sed -i "/address=\/${validDomain}\//Id" "${wildcardFilename}" + validDomain=$(escapeDots "${validDomain}") + sed -i "/address=\/${validDomain}\//Id" "${wildcardFilename}" - #If a file is empty a system removes it - isEmptyFile=$(grep "address=" "${wildcardFilename}" 2> /dev/null) - if [[ -z "${isEmptyFile}" ]]; then + #If a file is empty a system removes it + isEmptyFile=$(grep "address=" "${wildcardFilename}" 2> /dev/null) + if [[ -z "${isEmptyFile}" ]]; then + rm "$wildcardFilename"; + fi + else rm "$wildcardFilename"; fi From 93740ed7a323d0c4a25c8d4bb3def084a1efc471 Mon Sep 17 00:00:00 2001 From: DjoSmer Date: Fri, 1 Mar 2024 22:38:08 +0500 Subject: [PATCH 3/3] fix: init function didn't create your dir --- advanced/Scripts/webpage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/webpage.sh b/advanced/Scripts/webpage.sh index 373fd552..d0f0218a 100755 --- a/advanced/Scripts/webpage.sh +++ b/advanced/Scripts/webpage.sh @@ -839,7 +839,7 @@ InitCustomWildcardDNSRecord() { echo -e " ${TICK} Init custom Wildcard DNS record..." echo "conf-dir=${dnsCustomWildcardDNSDir}" >> "${dnsCustomWildcardDNSFile}" - mkdir -p dnsCustomWildcardDNSDir + mkdir -p "${dnsCustomWildcardDNSDir}" } AddCustomWildcardDNSRecord() {