API OVH
Synchro avec la zone photos-nas.ovh sur OVH via l'API: -on récupère via l'API la list des CNAME sur la zone photos-nas.ovh => zone.photos-nas.ovh -on ajoute ou supprime les CNAME sur la zone photos-nas.ovh
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
.env
|
.env
|
||||||
.envrc
|
.envrc
|
||||||
|
.DS_Store
|
||||||
@@ -11,6 +11,7 @@ drive
|
|||||||
ds916
|
ds916
|
||||||
ds923
|
ds923
|
||||||
files
|
files
|
||||||
|
ftp
|
||||||
git
|
git
|
||||||
gitea
|
gitea
|
||||||
glances
|
glances
|
||||||
|
|||||||
@@ -1,7 +1,13 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Sync_pihole_lan.sh synchronise the /etc/pihole/lan.list file with your Subdomains
|
# 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"
|
italic="\033[3m"
|
||||||
underline="\033[4m"
|
underline="\033[4m"
|
||||||
@@ -21,7 +27,7 @@ reset="\033[0m"
|
|||||||
absent=()
|
absent=()
|
||||||
delete=()
|
delete=()
|
||||||
domain=".photos-nas.ovh"
|
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")
|
not_used=("ds916" "musiiic" "notif")
|
||||||
|
|
||||||
pihole1=192.168.2.116
|
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"
|
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
|
cat < /dev/null > /dev/tcp/1.1.1.1/53
|
||||||
if [[ $? -ne 0 ]]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
echo -e "\n${red}No Internet connection !${reset}"
|
echo -e "\n${red}No Internet connection !${reset}"
|
||||||
@@ -39,7 +47,7 @@ fi
|
|||||||
|
|
||||||
echo -e "${bold}Backup ${italic}lan.list...${reset}"
|
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 "$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}"
|
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
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
COMMENTS
|
||||||
|
|
||||||
nb_dynhost=$(awk 'END { print NR }' lan.list)
|
nb_dynhost=$(awk 'END { print NR }' lan.list)
|
||||||
echo -e "\n$nb_dynhost dynhost found in 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}"
|
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}')
|
ndd=$(echo "${line}" | awk '{print $2}' | awk -F"." '{print $1}')
|
||||||
if [[ " ${not_required[*]} " =~ " $ndd " ]] || [[ " ${not_used[*]} " =~ " $ndd " ]]; then
|
if [[ " ${not_required[*]} " =~ " $ndd " ]] || [[ " ${not_used[*]} " =~ " $ndd " ]]; then
|
||||||
delete+=(${ndd})
|
if [[ ! "$line" == *asusrouter* ]]; then
|
||||||
|
delete+=(${ndd})
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
done < lan.list
|
done < lan.list
|
||||||
@@ -102,8 +114,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Ajout des DynHOST de OVH (Zones DNS) dans les 2 lan.list (pihole1 & pihole2)
|
# 3. Recherche des sous-domaines manquants dans lan.list (d'après subdomains.photos-nas.ovh.txt)
|
||||||
# Zones DNS -> photos-nas.ovh -> Historique des zones
|
|
||||||
|
|
||||||
echo -e "${bold}\nFind missing dynhost in ${italic}lan.list...${reset}"
|
echo -e "${bold}\nFind missing dynhost in ${italic}lan.list...${reset}"
|
||||||
|
|
||||||
@@ -169,11 +180,11 @@ if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
|
|||||||
fi
|
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"
|
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)")
|
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
|
read -p "$b" choice
|
||||||
@@ -207,7 +218,203 @@ else
|
|||||||
echo -e "OK, let's continue..."
|
echo -e "OK, let's continue..."
|
||||||
fi
|
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 /tmp/temp_file.list ] && rm /tmp/temp_file.list
|
||||||
[ -f lan.list.sorted ] && rm lan.list.sorted
|
[ -f lan.list.sorted ] && rm lan.list.sorted
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user