diff --git a/.gitignore b/.gitignore index 75fc1e4..c5c9a9b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .env .envrc +.DS_Store \ No newline at end of file diff --git a/subdomains.photos-nas.ovh.txt b/subdomains.photos-nas.ovh.txt index 0c2edcd..4353bd5 100644 --- a/subdomains.photos-nas.ovh.txt +++ b/subdomains.photos-nas.ovh.txt @@ -11,6 +11,7 @@ drive ds916 ds923 files +ftp git gitea glances diff --git a/sync_pihole_lan.sh b/sync_pihole_lan.sh index e8bcac0..02649b7 100755 --- a/sync_pihole_lan.sh +++ b/sync_pihole_lan.sh @@ -1,7 +1,13 @@ #!/usr/bin/env bash # Sync_pihole_lan.sh synchronise the /etc/pihole/lan.list file with your Subdomains -# v3.0 +# v4.0 synchro avec la zone photos-nas.ovh sur OVH via l'API + +# 1. liste principale des sous-domaines => subdomains.photos-nas.ovh.txt +# 2. sauvegarde des lan.list de chaque pihole => lan.list.1 et lan.list.2 +# 3. lan.list à jour que l'on copie sur chaque pihole +# 4. on récupère via l'API la list des CNAME sur la zone photos-nas.ovh => zone.photos-nas.ovh +# 5. on ajoute ou supprime les CNAME sur la zone photos-nas.ovh italic="\033[3m" underline="\033[4m" @@ -21,7 +27,7 @@ reset="\033[0m" absent=() delete=() domain=".photos-nas.ovh" -not_required=("drive" "files" "gitea" "home-assistant" "homebridge" "portainer" "tunes" "wg" "yatch") +not_required=("drive" "files" "gitea" "home-assistant" "homebridge" "portainer" "tunes" "wg" "www" "yatch") not_used=("ds916" "musiiic" "notif") pihole1=192.168.2.116 @@ -29,6 +35,8 @@ pihole2=192.168.2.216 echo -e "${greenbold}Sync_pihole_lan.sh synchronise the /etc/pihole/lan.list file with your Subdomains ...${reset}\n" +: << 'COMMENTS' + cat < /dev/null > /dev/tcp/1.1.1.1/53 if [[ $? -ne 0 ]]; then echo -e "\n${red}No Internet connection !${reset}" @@ -39,7 +47,7 @@ fi echo -e "${bold}Backup ${italic}lan.list...${reset}" -# Sauvegarde du /etc/pihole/lan.list de chaque pihole vers lan.list.1 et lan.list.2 +# 1. Sauvegarde du /etc/pihole/lan.list de chaque pihole vers lan.list.1 et lan.list.2 ping -q -c1 "$pihole1" &>/dev/null && ssh -p51322 root@"$pihole1" "cat /etc/pihole/lan.list" > lan.list.1 || echo -e "\n${red}Pihole1 is unreachable !'${reset}" ping -q -c1 "$pihole2" &>/dev/null && ssh -p51522 root@"$pihole2" "cat /etc/pihole/lan.list" > lan.list.2 || echo -e "${red}Pihole2 is unreachable !'${reset}" @@ -62,11 +70,13 @@ else exit fi +COMMENTS + nb_dynhost=$(awk 'END { print NR }' lan.list) echo -e "\n$nb_dynhost dynhost found in lan.list !" -# Suppression des 'not_required' et 'not_used' dans le lan.list +# 2. Suppression des 'not_required' et 'not_used' dans le lan.list echo -e "${bold}\nFind extra dynhost in ${italic}lan.list...${reset}" @@ -74,7 +84,9 @@ while IFS= read -r line; do ndd=$(echo "${line}" | awk '{print $2}' | awk -F"." '{print $1}') if [[ " ${not_required[*]} " =~ " $ndd " ]] || [[ " ${not_used[*]} " =~ " $ndd " ]]; then - delete+=(${ndd}) + if [[ ! "$line" == *asusrouter* ]]; then + delete+=(${ndd}) + fi fi done < lan.list @@ -102,8 +114,7 @@ else fi -# Ajout des DynHOST de OVH (Zones DNS) dans les 2 lan.list (pihole1 & pihole2) -# Zones DNS -> photos-nas.ovh -> Historique des zones +# 3. Recherche des sous-domaines manquants dans lan.list (d'après subdomains.photos-nas.ovh.txt) echo -e "${bold}\nFind missing dynhost in ${italic}lan.list...${reset}" @@ -169,11 +180,11 @@ if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then fi -# On exporte lan.list vers chaque /etc/pihole/lan.list (pihole1 et pihole2) +# 4. On exporte lan.list vers chaque /etc/pihole/lan.list (pihole1 et pihole2) -: << 'COMMENTS' +: << 'COMMENTS2' echo "toto" -COMMENTS + b=$(echo -e "Do you want to export ${italic}lan.list${reset} to ${bold}pihole1${reset} ($pihole1) and ${bold}pihole2${reset} ($pihole2) ? (y/n)") read -p "$b" choice @@ -207,7 +218,203 @@ else echo -e "OK, let's continue..." fi -# On supprime les fichiers temporaires +COMMENTS2 + +# 5. On compare la liste principale des sous-domaines subdomains.photos-nas.ovh.txt avec la zone photos-nas.ovh sur ovh (via l'API) + +# On récupère la zone photos-nas.ovh depuis ovh +# a) Zones DNS -> photos-nas.ovh -> Historique des zones => photos-nas.ovh_dns_data.txt +# b) API OVH -> liste des CNAME de la zone photos-nas.ovh => zone.photos-nas.ovh + +HTTP_QUERY="https://api.ovh.com/1.0/domain" +TIME=$(curl -s https://api.ovh.com/1.0/auth/time) + +ZONE_FILE="zone.photos-nas.ovh" +ZONE="photos-nas.ovh" + +source ovh_secrets.txt + +export_zone() { + HTTP_METHOD="GET" + HTTP_BODY="" + HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/export" + + CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME" + SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //') + + curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY | sed 's/\\n/\n/g' | sed 's/\"//g' | grep 'CNAME'> $ZONE_FILE + #curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY | sed 's/\\n/\n/g' | grep 'CNAME' + # |sed 's/,//g' |sed 's/\\n/\'$'\n''/g' + # | sed 's/\\n/\n/g' + #echo $? + if [ $? == 0 ]; then + echo -e "File ${italic}$ZONE_FILE${reset} have been created from OVH $ZONE zone !" + fi +} + +remove_cname() { + record="" + + HTTP_METHOD="GET" + HTTP_BODY="" + HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/record?fieldType=CNAME&subDomain=$1" + + CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME" + SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //') + + record=$(curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY | sed 's/.//;s/.$//') + #echo $? # 0 + if [ $? == 0 ] && [ -n "$record" ]; then + echo "Record number for CNAME $1 is $record !" + + HTTP_METHOD="DELETE" + HTTP_BODY="" + HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/record/$record" + + CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME" + SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //') + + curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY + #echo $? # 0 + if [ $? == 0 ]; then + echo "CNAME $1 have been successfully deleted !" + else + echo "Error while deleting CNAME $1 !" + fi + + else + echo "No record number found for CNAME $1 !" + fi + +} + +add_cname() { + HTTP_METHOD="POST" + HTTP_BODY="{\"fieldType\": \"CNAME\",\"subDomain\": \"$1\",\"target\": \"photos-nas.ovh.\",\"ttl\": 0}" + HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/record" + + CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME" + SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //') + + curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY + #echo $? # null + if [ $? == 0 ]; then + echo "CNAME $1 have been successfully added !" + else + echo "Error adding CNAME $1 !" + fi + + HTTP_BODY="" + HTTP_QUERY="https://eu.api.ovh.com/v1/domain/zone/$ZONE/refresh" + + CLEAR_SIGN="$OVH_APP_SECRET+$OVH_CONSUMER_KEY+$HTTP_METHOD+$HTTP_QUERY+$HTTP_BODY+$TIME" + SIG='$1$'$(echo -n $CLEAR_SIGN | openssl dgst -sha1 | sed -e 's/^.* //') + + curl --silent -X $HTTP_METHOD -H "Content-Type:application/json;charset=utf-8" -H "X-Ovh-Application:$OVH_APP_KEY" -H "X-Ovh-Timestamp:$TIME" -H "X-Ovh-Signature:$SIG" -H "X-Ovh-Consumer:$OVH_CONSUMER_KEY" --data "$HTTP_BODY" $HTTP_QUERY + #echo $? # 0 + if [ $? == 0 ]; then + echo "Zone $ZONE have been successfully refresh !" + else + echo "Error while refreshing zone $ZONE !" + fi +} + + +echo -e "${bold}\nGet extra CNAME records list from zone ${italic}$ZONE${reset} (API OVH)..." + +export_zone + +#ovh_cname_list=$(cat photos-nas.ovh_dns_data.txt | grep "CNAME" | sed '1d') + + +ovh_cname_list=$(cat $ZONE_FILE) +subdomains_list=$(cat subdomains.photos-nas.ovh.txt) +extra_ovh=() +absent_ovh=() + +echo -e "${bold}\nFind extra CNAME records in zone ${italic}$ZONE${reset}..." + +while IFS= read -r line; do + + dynhost=$(echo "${line}" | awk '{print $1}') + grep -q $dynhost subdomains.photos-nas.ovh.txt + + if [ $? != 0 ]; then + if [[ ! " ${not_required[*]} " =~ " $dynhost " ]] && [[ ! " ${not_used[*]} " =~ " $dynhost " ]]; then + #echo "$dynhost présent sur ovh" + extra_ovh+=(${dynhost}) + fi + fi + + # 55 sur ovh + # 54 sur subdomains.photos-nas.ovh.txt + # 43 sur lan.list + +done <<< "$ovh_cname_list" + +if [ ${#extra_ovh[@]} -ge 1 ]; then + + echo -e "${red}To delete: ${extra_ovh[@]}${reset}" + + for val in ${!extra_ovh[@]} + do + value="${extra_ovh[$val]}" + + b=$(echo -e "Do you want to delete ${red}$value${reset} CNAME in OVH zone ${italic}$ZONE${reset} ? (y/n)") + read -p "$b" choice + if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then + remove_cname "$value" + fi + + done + #nb_dynhost=$(awk 'END { print NR }' lan.list) + #echo "$nb_dynhost dynhost found in lan.list !" + #fi +else + echo "None" +fi + +echo -e "${bold}\nFind missing CNAME records in zone ${italic}$ZONE${reset}..." + +while IFS= read -r line; do + + dynhost=$(echo "${line}" | awk '{print $1}') + grep -q $dynhost zone.photos-nas.ovh + + if [ $? != 0 ]; then + if [[ ! " ${not_required[*]} " =~ " $dynhost " ]] && [[ ! " ${not_used[*]} " =~ " $dynhost " ]]; then + #echo "$dynhost absent sur ovh" + absent_ovh+=(${dynhost}) + fi + fi + +done <<< "$subdomains_list" + +if [ ${#absent_ovh[@]} -ge 1 ]; then + + echo -e "${red}To add: ${absent_ovh[@]}${reset}" + + + for val in ${!absent_ovh[@]} + do + value="${absent_ovh[$val]}" + + b=$(echo -e "Do you want to add ${red}$value${reset} CNAME in OVH zone ${italic}$ZONE${reset} ? (y/n)") + read -p "$b" choice + if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then + echo "$value" + add_cname "$value" + fi + done + #nb_dynhost=$(awk 'END { print NR }' lan.list) + #echo "$nb_dynhost dynhost found in lan.list !" + +else + echo "None" +fi + + +# 6. On supprime les fichiers temporaires [ -f /tmp/temp_file.list ] && rm /tmp/temp_file.list [ -f lan.list.sorted ] && rm lan.list.sorted